簡體   English   中英

Hibernate ManyToOne n + 1選擇id

[英]Hibernate ManyToOne n+1 select with id

n + 1選擇查詢我遇到了一個奇怪的問題。 我的映射看起來像這樣:

@Entity
@IdClass(MyTablePK.class)
@Table(name = "my_table", schema = "schema")
public class MyTable {

    @Id
    @Column(name = "name", nullable = false, length = 12)
    private String name="";

    @Id
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "myStringValue", referencedColumnName = "myStringValue")
    private AdditionalData data;

    ... (other fields, getters, setters)
}

public class MyTablePK implements Serializable {

    private String name;

    private AdditionalData data;

    (getters,setters)

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        MyTablePK that = (MyTablePK) o;

        if (name!= null ? !name.equals(that.name) : that.name!= null) return false;
        return !(data!= null ? !data.equals(that.data) : that.data!= null);

    }

    @Override
    public int hashCode() {
        int result = name!= null ? name.hashCode() : 0;
        result = 31 * result + (data!= null ? data.hashCode() : 0);
        return result;
    }
}

@Entity
@Table(name = "info", schema = "schema")
public class AdditionalData implements Serializable {

    @Id
    @Column(name = "recno")
    private Long recno;

    @Column(name = "info1", length = 3)
    private String info1;

    @Column(name = "info2", length = 3)
    private String info2;

    ... (getters, setters)

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        AdditionalData data = (AdditionalData) o;

        return recno.equals(data.recno);

    }

    @Override
    public int hashCode() {
        return recno.hashCode();
    }
}

現在,我從MyTable中選擇所有值。 正如預期的那樣,我得到n + 1個選擇,對於每個MyTable行,一個新的AdditionalData查詢到達。 為了爭取我寫了一個連接獲取查詢:

FROM MyTable mytab join fetch mytab.data

但是......並沒有改變任何事情。

現在,有趣的是,如果我暫時忽略業務需求,並刪除@IdClass使name成為唯一的@Id - 一切正常,所有數據都通過單個查詢獲得。 這是為什么? 我不能用復合id的一部分來對抗n + 1選擇嗎?

如果它是相關的 - 我使用Hibernate 4.3.5.Final與Oracle數據庫

這可能與此處的已知問題有關: https//hibernate.atlassian.net/browse/HHH-10292

嘗試將myStringValue列映射兩次 一旦作為id和String ,另一次作為AdditionalData其中insertable = false, updatable = false在join列中為insertable = false, updatable = false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM