Java Hibernate集合更新被唯一索引阻止
我正试图在一个由Hibernate控制的数据库中,将一个子对象从一个父对象移动到另一个父对象。我在一个由Hibernate通过@OneToMany注释创建和控制的表上发现一个错误。希望有人知道解决这个问题的方法 我有两个对象,一个包含另一个对象的列表。我们叫他们狗窝和狗吧。我正在做的是将一只狗从一个狗窝移到另一个狗窝: 涉及三个表格: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
-- 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