在过去的几天里,我一直在为一个非常令人沮丧的问题而奋斗。
我们有大量的hibernate实体,它们都是生成的代码。这意味着创建了@OneToMany集合(以及其他内容):
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "tablename")
private java.util.List<classname> fieldname;
在我们的应用程序中,我们希望能够为第二个用户复制所有这些内容。我们通过阅读所有这些类和字段并稍后重新创建它们(通过它们的构造函数)来完成此操作。然而,似乎读取此集合会导致Hibernate将集合标记为脏。当Hibernate首次尝试删除行然后再次插入时,这会在写入数据库时导致奇怪的约束违规。
我的问题是: 为什么Hibernate甚至想删除然后插入那行?为什么会失败?
我的猜测是Hibernate试图重新创建整个集合,因为Hibernate认为它被修改了。但是,情况显然并非如此。
编辑:我应该指出,在阅读集合后使用HibernateSession #exvict似乎可以解决问题。然而,这感觉非常hacky,我更喜欢更周到的。
答案 0 :(得分:2)
如果你的连接表没有任何主键,那么hibernate总是会将其记录为新记录,并尝试删除引用记录并插入新记录。
但是如果你的连接表有自己的主键,那么如果primery键为null,它将插入记录,如果存在primery键值,那么它将更新其他方式它将删除表中但不在列表中的记录。
Hibernate需要主键来识别新记录或旧记录,否则它对于Join table case总是新的。