如何在不获取完整实体的情况下获取依赖休眠实体的外键列值



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

安装程序是两个在 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的输入,该根据 FK 是否为 null 显示不同的列内容。但是当我测试m.getN() != null这会导致休眠加载N。我怎样才能避免这种情况?

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

编辑 2:原来新问题是这个问题的副本:当我只访问外键 ID 时,如何防止 Hibernate 获取已加入的实体? - 所以,接近投票?

创建一个投影映射,其中包含 M 或多个 M 字段,例如 N 的 id

您的查询可能会像

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

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

如果跳出 Hibernate "实体映射器"框,则可以直接查询数据库,例如,计算MN数。

最新更新