在Hibernate中控制更新顺序

7
我有一个表,其中有一个唯一的列"token",数据库中通过唯一约束来强制实施。在某些情况下,我需要更改现有行,使其具有与另一个现有行相同的令牌,将第二行更改为新值。
例如,我有:
id;token 0;'aaa' 1;'bbb'
我想要将id 0('aaa')改为具有令牌'bbb'。所以我需要将'bbb'更改为'jfeisefjse',然后我可以将'aaa'更改为'bbb'。这可以在Postgres中使用单个事务完成。
我已经尝试在代码中做同样的事情:在一个事务中,我从现有行(第1行)获取令牌,将其设置为随机值,我更新其他行(第0行)以具有第1行的令牌,然后提交。但是Hibernate不尊重我所做的提交顺序。它似乎总是首先运行对第0行的更新语句,而Postgres则抱怨违反了外键约束。
我该如何让Hibernate做到这一点?要么强制执行特定的更新语句顺序,要么采用其他方法?
注意:不能在两个事务中执行此操作(一个用于混淆第1行,另一个事务用于更新第0行)。
1个回答

7

Session.flush()会强制Hibernate在不提交事务的情况下写入任何未完成的SQL语句。虽然有点笨重,但有时您需要变得更加灵活,使事情正常工作 :)


谢谢,它可以运行。这比我脑海中备份的做法更好:编写原始SQL以执行更新,并让Hibernate按正确顺序执行更新。谢谢。 - John Smith
1
警告:Hibernate会在任何时候忽略flush()。它不能以任何方式、形式或形态保证SQL将在您想要运行它的时候运行。 - Noah Yetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接