9

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

设置是 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; }
}

很容易。在我的应用程序中,我有一个有或没有的Ms列表。N此列表是 a 的输入,h:dataTable它根据 FK 是否为空来显示不同的列内容。但是当我测试m.getN() != null这会导致休眠加载N。我怎样才能避免这种情况?

编辑:这实际上是我的一个错误,正如 JBNizet 在评论中指出的那样。为了至少使这对某人有用并保持上面的布局,我将问题改写为“如何在不获取完整实体的情况下获取依赖 Hibernate 实体的外键列值?” 正如 Aaron Digulla 所建议的那样。

编辑 2:原来新问题是这个问题的重复:当我只访问外键 id 时,如何防止 Hibernate 获取加入的实体?- 所以,近距离投票?

4

2 回答 2

1

Create a projection mapping which contains M or several fields of M and e.g. id of N

Your query might liook sopething like

select new com.my.ProjectionObject(m, m.n.id) from M m where ...

于 2012-08-02T11:39:18.520 回答
-1

你如何期望 Hibernate 告诉你一些它不知道的事情?在不加载实体的情况下,Hibernate 无法知道它是否(仍然)存在。

如果您跳出 Hibernate “实体映射器”框,则可以直接查询数据库,例如,N计算M.

于 2012-08-02T11:41:19.323 回答