2011-05-29 50 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