0

在过去的几天里,我一直在努力解决一个非常令人沮丧的问题。

我们有大量的休眠实体,它们都是生成的代码。这意味着创建了以下@OneToMany 集合(除其他外):

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "tablename")
private java.util.List<classname> fieldname;

在我们的应用程序中,我们希望能够为第二个用户复制所有这些。我们通过读取所有这些类和字段并稍后重新创建它们(通过它们的构造函数)来做到这一点。然而,读取这个集合似乎会导致 Hibernate 将该集合标记为脏。当 Hibernate 第一次尝试删除一行然后再次插入时,这会导致在写入数据库时​​出现奇怪的约束冲突。

我的问题是:为什么 Hibernate 甚至要删除然后插入该行?为什么会失败?

我的猜测是 Hibernate 尝试重新创建整个集合,因为出于某种原因,Hibernate 认为它已被修改。然而,情况显然并非如此。

编辑:我应该指出,在阅读集合后使用 HibernateSession#evict 似乎可以解决问题。然而,这感觉很hacky,我更喜欢一个更深思熟虑的。

4

1 回答 1

2

如果您的连接表没有任何主键,那么休眠总是将其视为新记录并尝试删除参考记录并插入新记录。

但是,如果您的连接表有自己的主键,那么如果初级键为空,它将插入记录,如果初级键值存在,那么它将更新,否则它将删除表中但不在列表中的记录。

Hibernate 需要主键来识别新记录或旧记录,否则对于 Join 表的情况它将始终是新的。

于 2013-03-05T09:38:27.707 回答