我有一个带有唯一列的表,“token”,由数据库中的唯一约束强制执行。在某种情况下,我需要将现有行更改为与另一个现有行具有相同的标记,将第二行更改为具有新值。
所以,说我有:
ID;令牌 0; 'AAA' 1; 'BBB'
我希望id 0('aaa')代替令牌'bbb'。因此我需要将'bbb'改为'jfeisefjse',然后我可以将'aaa'改为'bbb'。这可以在postgres中以单一的方式完成。
我试图在代码中执行相同的操作:在一个事务中,我从现有行(第1行)获取令牌,我将其设置为随机值,我将另一行(第0行)更新为有第1行的令牌,然后我提交。但是hibernate并不尊重我提交的顺序。它似乎总是首先运行第0行的update语句,而postgres抱怨它违反了外键约束。
如何让hibernate这样做?是强制某个更新语句的顺序,还是以其他方式执行此操作?
注意:在两个事务中执行此操作(一个用于加扰第1行,然后另一个事务用于更新第0行)不是一个选项。
答案 0 :(得分:5)
Session.flush()
将强制hibernate写入任何挂起的SQL而不提交事务。这有点笨拙,但有时候你需要少点“ORM”并让事情变得有效:)