Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对未修改的集合/实体的Constraintviolation_Java_Hibernate - Fatal编程技术网

Java 对未修改的集合/实体的Constraintviolation

Java 对未修改的集合/实体的Constraintviolation,java,hibernate,Java,Hibernate,在过去的几天里,我一直在努力解决一个令人沮丧的问题 我们有大量的hibernate实体,它们都是由代码生成的。这意味着将创建以下@OneToMany集合(以及其他集合): @OneToMany(cascade = CascadeType.ALL) @JoinTable(name = "tablename") private java.util.List<classname> fieldname; @OneToMany(cascade=CascadeType.ALL) @JoinTa

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

我们有大量的hibernate实体,它们都是由代码生成的。这意味着将创建以下@OneToMany集合(以及其他集合):

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "tablename")
private java.util.List<classname> fieldname;
@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name=“tablename”)
私有java.util.List字段名;
在我们的应用程序中,我们希望能够为第二个用户复制所有这些内容。我们通过读取所有这些类和字段并稍后(通过它们的构造函数)重新创建它们来实现这一点。然而,读取此集合似乎会导致Hibernate将集合标记为脏集合。当Hibernate首次尝试删除一行,然后再次插入该行时,写入数据库时,这会导致奇怪的约束冲突

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

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


编辑:我应该指出,阅读集合后使用HibernateSession#Exit似乎可以解决这个问题。但是,这感觉非常粗糙,我更喜欢一个更为深思熟虑的方法。

如果您的联接表没有任何主键,那么hibernate总是将其视为新记录,并尝试删除引用记录并插入新记录

但如果您的联接表有自己的主键,那么它将插入记录。如果primery键为null,那么它将以其他方式进行更新。它将删除表中但不在列表中的记录


Hibernate需要主键来识别新记录或旧记录,否则它对于联接表大小写来说总是新的。

当然!我应该意识到这一点。但是,它仍然没有解释为什么删除查询失败,或者为什么Hibernate将集合标记为脏集合。