在过去的几天里,我一直在努力解决一个非常令人沮丧的问题。
我们有大量的休眠实体,它们都是生成的代码。这意味着创建了以下@OneToMany 集合(除其他外):
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "tablename")
private java.util.List<classname> fieldname;
在我们的应用程序中,我们希望能够为第二个用户复制所有这些。我们通过读取所有这些类和字段并稍后重新创建它们(通过它们的构造函数)来做到这一点。然而,读取这个集合似乎会导致 Hibernate 将该集合标记为脏。当 Hibernate 第一次尝试删除一行然后再次插入时,这会导致在写入数据库时出现奇怪的约束冲突。
我的问题是:为什么 Hibernate 甚至要删除然后插入该行?为什么会失败?
我的猜测是 Hibernate 尝试重新创建整个集合,因为出于某种原因,Hibernate 认为它已被修改。然而,情况显然并非如此。
编辑:我应该指出,在阅读集合后使用 HibernateSession#evict 似乎可以解决问题。然而,这感觉很hacky,我更喜欢一个更深思熟虑的。