考虑存在两个对象A
和B
,其中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
?
答案 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。