2013-08-26 16 views
0

爲什麼打開未實例化的(實體)對象列表會恢復已對相同事務中的任何一個對象執行的更改?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進行更改之前解決該問題,但這不是一個令人滿意的解決方案,更不用說解釋問題。

回答

0

使變量保持靜態,以便使用相同的實例。

+0

同實例IS正在使用,根據「==」檢查我已經修改到我的問題中的場景。 – JohannSig

0

a.getB()== c.getListOfB()。get(properIndex)不正確。

雖然比較兩個對象,請使用equals()方法,而不是 「==」

==將比較對象的引用。

equals()比較對象屬性。

在你的情況下,你需要比較作爲實體對象的一個​​屬性的對象的主鍵。

以下是正確的:c.getListOfB()包含(a.getB())

下也是如此:。a.getB()等於(c.getListOfB()。得到(properIndex))

不知道在調用a.getB()和c.getListOfB()Hibernate會返回相同的參考實例。得到(properIndex),所以不要使用==而比較兩個objecs性的判定

+0

但它們是相同的對象引用,測試的情況。問題是,當我使用.isEmpty()方法實例化List時,JPA從數據庫中「再次」讀取子對象,恢復我之前對其子之一進行的更改。它應該知道其中一個子對象已經在持久化上下文中,而不會與其混淆。 – JohannSig