[英]Hibernate creating N+1 queries for @ManyToOne JPA annotated property
[英]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.