2014-09-04 63 views
0

Java代碼:JPA /休眠:忽略一直存在命名查詢

fooDAO.resetField(); // ...namedQuery 
foo.setField(true); 
fooDAO.persist(foo); 

foo.field是一個布爾屬性。

resetField()執行一個命名查詢,將所有db行中的字段設置爲FALSE。

如果foo.field最初是FALSE,hibernate執行2個SQL查詢,即。指定的查詢和setField/persist組合的更新查詢。 但是,如果foo.field最初爲TRUE,只是第一個SQL查詢得到執行,將所有行中的字段設置爲FALSE,第二個SQL查詢將被忽略! ...爲什麼?

+1

需要看更多的代碼才能得出結論。你給出的測試用例應該可以正常工作。它應該執行兩個查詢。 – 2014-09-04 08:00:45

回答

1

讓我引用作者ProJPA 2使用批量更新和刪除

...持續性 上下文未更新以反映操作結果。批量操作是針對數據庫的 SQL發出的,繞過了持久化上下文的內存中結構。(...)開發人員只能依賴大容量操作完成後檢索到的實體。(...)這意味着批量操作 要麼在交易中交易執行全部由自己或者是第一操作

在你的情況,我建議要麼重新安排的代碼在自己的事務附上批量更新或致電EntityManager.refresh()foo嘗試更改它之前。

您所描述的是預期的行爲,因爲批量更新後您的foo實例變得陳舊。它存在於記憶中,但不反映現實。