如何在不获取完整实体的情况下获取从属Hibernate实体的外键列值?

时间:2012-08-02 11:29:59

标签: java hibernate

我正在努力解决一个似乎太容易的问题:

安装程序是两个在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? - 所以,关闭投票?

2 个答案:

答案 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}}个数。