我有2个表user和userinfo。 userinfo表包含具有UNIQUE约束的user_id(用户表的id)列。 现在我有2个用户(primaryUser和secondaryUser),它们在user和userInfo表中有记录。
primaryInfo对象包含primaryUserId,secondaryInfo对象包含secondaryUserId
我想将primaryUser的userinfo数据交换到secondaryUser,反之亦然。我这样做
primaryInfo.setUserId(secondaryUser.getId());
secondaryInfo.setUserId(primaryUser.getId());
session.update(primaryInfo);
session.update(secondaryInfo);
但是当提交事务时,它会给出错误 错误org.hibernate.engine.jdbc.spi.SqlExceptionHelper:147错误:重复键值违反唯一约束“user_infos_unique_user” 细节:键(ui_user_id)=(52560087)已经存在。
请告诉你怎么做...谢谢
答案 0 :(得分:0)
错误显示:
userInfo表有一个唯一的约束。这意味着用户必须是唯一的。所以,如果你想刷两个用户ID。你必须执行以下步骤
1.删除约束
2.交换两个id(与你目前的代码相同)
3.添加Constaint。
答案 1 :(得分:0)
解决这一独特约束的一个可能技巧是进行3次更新:
使用其他行无法使用的列的值更新行A.如果不是非NULL约束,则可以使用NULL
,否则0
如果不被禁止,并假设它是整数,否则为负值。
然后用其最终值(行A中的前一个值)更新B行
然后用其真正的最终值(行B中的前一个值)更新行A
答案 2 :(得分:0)
您可以在约束上使用DEFERRABLE和INITIALLY DEFERRED属性,并在单个事务中更新两个记录。 DEFERRED意味着在提交事务之前不会评估约束 - 此时它应该再次有效。
但是:我还没弄清楚如何使用Hibernate注释来指定DEFERRED属性,所以你必须使用LiquiBase来维护数据库模式(无论如何都不是坏主意。)(或者使用“原始”SQL,这是不是一个好主意。)
答案 3 :(得分:0)
对于Oracle数据库,您可以创建具有特殊属性' DEFERRABLE INITIALIALLY DEFERRED '的下一个唯一约束:
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (table_field) DEFERRABLE INITIALLY DEFERRED