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

Java 如何在不获取完整实体的情况下获取依赖Hibernate实体的外键列值?,java,hibernate,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 Array

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

设置是在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;
@manytone(fetch=FetchType.LAZY)
public N getN(){return N;}
公共无效集N(N){this.N=N;}
}
@实体
N类{
私有列表ms=newarraylist();
@OneToMany(mappedBy=“n”)
公共列表getMs(){return ms;}
public void setMs(List ms){this.ms=ms;}
}
很简单。在我的应用程序中,我有一个
M
s的列表,它们要么有
N
,要么没有。此列表是一个
h:dataTable
的输入,该表根据FK是否为空显示不同的列内容。但是当我测试
m.getN()!=null
这会导致hibernate加载
N
。我怎样才能避免这种情况

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


编辑2:新问题与此问题重复:-那么,结束投票吗?

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

你的问题可能是这样的


从m中选择新的com.my.ProjectionObject(m,m.n.id),其中…

您希望Hibernate如何告诉您它不知道的事情?如果不加载实体,Hibernate无法知道它是否(仍然)存在


如果您跳出Hibernate“entity mapper”框,您可以直接查询数据库,例如,为您的
M

计算
N
s的数量,它不应该这样做。确保不对
m.getN()
@JBNizet-Ew返回的N调用任何方法,你是对的。实际的查询要求另一个实体将OneToOne连接到M.Reading skills--。现在我觉得很愚蠢。默认的hibernate会在M上创建一个FK。如果M是一个普通的列哈希映射,我会选中M.get(“n_id”)!=无效的我可能应该编辑这个问题,使其包含两个PK,这样更明显。这是一个不同的问题。您想知道的是“当我调用getN()时,如何获取Hibernate将使用的ID?”