我正在努力解决一个似乎太容易的问题:
安装程序是两个在Hibernate 3中具有多对一关系的实体:
@Entity
class M {
private N n;
@ManyToOne(fetch = FetchType.LAZY)
public N getN() { return n; }
public void setN(N n) { this.n = n; }
}
@Entity
class N {
private List<M> ms = new ArrayList<M>();
@OneToMany(mappedBy="n")
public List<M> getMs() { return ms; }
public void setMs(List<M> ms) { this.ms = ms; }
}
够容易。在我的应用程序中,我有一个M
的列表,其中包含N
或不具有h:dataTable
。此列表是m.getN() != null
的输入,根据FK是否为空,显示不同的列内容。但是,当我测试N
时,这会导致hibernate加载{{1}}。我怎么能避免这个?
编辑:这实际上是我的错误,正如JBNizet在评论中指出的那样。为了至少使这对某人有用并与上面的布局保持一致,我将问题改为“如何在不获取完整实体的情况下获取依赖Hibernate实体的外键列值?”正如Aaron Digulla所说。
编辑2 :原来这个新问题与此问题重复:How can I prevent Hibernate fetching joined entities when I access only the foreign key id? - 所以,关闭投票?
答案 0 :(得分:1)
创建一个投影映射,其中包含M或M的多个字段,例如N的身份
您的查询可能会像
那样liook select new com.my.ProjectionObject(m, m.n.id) from M m where ...
答案 1 :(得分:-1)
你如何期待Hibernate告诉你它不知道的事情?在不加载实体的情况下,Hibernate无法知道它是否仍然存在。
如果您走出Hibernate“实体映射器”框,您可以直接查询数据库,例如,计算N
的{{1}}个数。