爲什麼打開未實例化的(實體)對象列表會恢復已對相同事務中的任何一個對象執行的更改?Java - JPA - 實例化子實體列表還原已在其中一個事務中進行的更改
場景:
- A,B和C是所有實體
- A持有參考到B的特定實例,用檢索a.getB();
- C具有乙對象的列表,檢索與c.getListOfB()
- 以下是真實的:。)c.getListOfB(含有(a.getB())
- 下面也進行了測試真:a.getB()== c.getListOfB()得到(properIndex)(同一對象的引用)
如果我在一個事務中以下內容:
B b = a.getB();
b.setOk(true); // <-- Changed from false to true
,然後遵循:
c.getListOfB().isEmpty() // <-- Any function will do, I just used .isEmpty() to test it
那麼B立即再次有設置爲false OK值:/
這種情況發生在同一個事務中,提交到數據庫之前。
有人可以這樣友好地向我解釋爲什麼EntityManager不知道在交易中對上述實體已經做出的更改,以及如何確保它保留它們?這導致我進行了一次長時間的尋找bug,而且我毫不知情地說,如何在網上找到有用的結果。
編輯:問題是,當我用.isEmpty()方法實例化列表時,JPA從數據庫中讀取子對象「再次」,恢復我早已對其子項之一進行的更改在交易中。我覺得它應該知道其中一個子對象已經存在於持久化上下文中,而不會與其混淆。
我目前正在通過調用c.getListOfB()。isEmpty(),即實例化List,在對b進行更改之前解決該問題,但這不是一個令人滿意的解決方案,更不用說解釋問題。
同實例IS正在使用,根據「==」檢查我已經修改到我的問題中的場景。 – JohannSig