2011-05-29 53 views
5

我有一个唯一列“token”的表,由数据库中的一个唯一约束强制执行。在某些情况下,我需要将现有行更改为与另一现有行具有相同的标记,并将第二行更改为具有新值。休眠更新的控制顺序

所以,说我有:

ID;令牌 0; 'AAA' 1; 'BBB'

我想ID 0( 'AAA'),而不是持有令牌 'BBB' 。所以我需要将'bbb'改为'jfeisefjse',然后我可以将'aaa'改为'bbb'。这可以在postgres中以单个tranas的方式完成。我试图在代码中做同样的事情:在一个事务中,我从现有行(第1行)获取该令牌,将其设置为随机值,我更新另一行(第0行)有行1的标记,然后我承诺。然而,hibernate并不尊重我已经完成提交的顺序。它似乎总是首先为第0行运行update语句,并且postgres抱怨它违反了外键约束。

我该如何让冬眠做到这一点?要么强制更新语句的某个顺序,要么以其他方式执行此操作?

注意:在两个事务中执行此操作(一个用于加扰第1行,然后另一个事务用于更新第0行)不是一个选项。

回答

5

Session.flush()将迫使hibernate写入任何挂起的SQL而不提交事务。这有点笨重,但有时候你需要减少一点'ORM',让事情正常工作:)

+0

谢谢,它的工作原理。这比我作为备份时所想的要好:写入原始的sql来执行它,然后让hibernate按照正确的顺序执行更新。谢谢 – 2011-05-29 12:15:41

+1

警告:只要感觉喜欢,hibernate会忽略flush()。它不能以任何方式,形状或形式保证SQL将在您需要时运行。 – 2014-04-18 21:13:04