Session.contains对由OneToMany关系加载的对象返回false

时间:2014-07-31 04:19:29

标签: java hibernate session orm hibernate-mapping

考虑存在两个对象AB,其中A包含与B的OneToMany关系。我加载对象A并迭代它的B。但问题是,当我致电Session.contains(B[0])时,它会返回false

在上一个会话中我有加载对象b (b=B[0]),在加载对象A之前的这个会话中我调用了b2=Session.merge(b),当我再次加载对象A时,它会填充B字段b代替b2;

是否有人知道为什么B填充b代替b2

1 个答案:

答案 0 :(得分:3)

你可能有一个Set作为你的一对多集合,你的equals / hashCode正在使用数据库标识符。

当您向集合添加元素时,hashCode用于将元素放置在右侧存储桶中。刷新会话后,将分配标识符,因此hashCode会更改。但是该对象仍然放在旧的hashCode存储桶中。当您尝试使用新的hashCode值加载它时,您将不会再看到对象。

这就是为什么在域模型实体或use a business key中实现equals / hashCode时需要use this trick if you don't have any business key