Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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 Hibernate集合更新被唯一索引阻止_Java_Mysql_Sql_Hibernate - Fatal编程技术网

Java Hibernate集合更新被唯一索引阻止

Java Hibernate集合更新被唯一索引阻止,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,我正试图在一个由Hibernate控制的数据库中,将一个子对象从一个父对象移动到另一个父对象。我在一个由Hibernate通过@OneToMany注释创建和控制的表上发现一个错误。希望有人知道解决这个问题的方法 我有两个对象,一个包含另一个对象的列表。我们叫他们狗窝和狗吧。我正在做的是将一只狗从一个狗窝移到另一个狗窝: 涉及三个表格: -- Table is mapped to Kennel object TABLE kennels (kennel_id int) -- Table is

我正试图在一个由Hibernate控制的数据库中,将一个子对象从一个父对象移动到另一个父对象。我在一个由Hibernate通过@OneToMany注释创建和控制的表上发现一个错误。希望有人知道解决这个问题的方法

我有两个对象,一个包含另一个对象的列表。我们叫他们狗窝和狗吧。我正在做的是将一只狗从一个狗窝移到另一个狗窝:

涉及三个表格:

-- Table is mapped to Kennel object    
TABLE kennels (kennel_id int)
-- Table is a join table controlled by Hibernate
TABLE kennels_dogs (kennels_kennel_id int, dogs_dog_id int)
-- Table is mapped to Dog object
TABLE dogs (dog_id int)
我得到的具体错误是在连接表kennels_dogs上

但是文件中只有一条记录有这个ID——我正试图更新的记录。Hibernate似乎在尝试在kennels_dogs表中插入一条记录,在删除旧记录之前使用新值

例如,假设一只id=14的狗在id=12的狗窝里。我们想把狗移到id=47的狗窝里。可以使用以下命令手动执行此操作:

DELETE FROM kennels_dogs WHERE kennels_kennel_id=12 AND dogs_dog_id=12
INSERT INTO kennels_dogs (kennels_kennel_id, dogs_dog_id) VALUES (47, 12)
Hibernate所做的是以相反的顺序执行这些操作:

INSERT INTO kennels_dogs (kennels_kennel_id, dogs_dog_id) VALUES (47, 12)
DELETE FROM kennels_dogs WHERE kennels_kennel_id=12 AND dogs_dog_id=12
由于字段dogs\u dog\u id上的唯一索引,插入失败-表中已存在dogs\u dog\u id=12的记录

看起来显而易见的解决方案可能是删除唯一索引,但在不知道它为什么在那里的情况下,我很犹豫是否删除它,从逻辑上讲,这是正确的-狗一次只能在一个地方


有谁能想出一个绝妙的办法吗?

我觉得奇怪的是,你们居然有一张狗舍狗狗联谊桌。对于@OneToMany,这应该不是必需的。根据Hibernate文档:

6.2.5。一对多协会

一对多关联通过一个外键链接两个类的表,而不使用 中间的收集台

我会确保您在您的犬舍类中的狗集合中标注了@onetomanaymappedby=dog,以及@ManyToOne @JoinColumnname=kennel_id,nullable=false
注释在您的Dog类上。

是的,由于这是一对多的关系,所以没有理由在该表上。多年来,很多人都致力于这一设计,我确信这是早期的产物。我之所以将此标记为正确,是因为它实际上是正确的答案-此模式中不应包含联接表。然而,我实际解决这个问题的方式是完全不同的,而且是如此愚蠢和独特,希望没有其他人需要解决同样的问题。它涉及控制器级事务和糟糕的屏幕设计。就像我说的,希望没有其他人会碰到它
DELETE FROM kennels_dogs WHERE kennels_kennel_id=12 AND dogs_dog_id=12
INSERT INTO kennels_dogs (kennels_kennel_id, dogs_dog_id) VALUES (47, 12)
INSERT INTO kennels_dogs (kennels_kennel_id, dogs_dog_id) VALUES (47, 12)
DELETE FROM kennels_dogs WHERE kennels_kennel_id=12 AND dogs_dog_id=12