簡體   English   中英

Java-JPA-實例化子實體列表將還原事務中已經對其進行的更改

[英]Java - JPA - Instantiating a List of child entities reverts changes already made to one of them within the transaction

為什么打開一個未實例化的(實體)對象列表,為什么會還原同一事務中已經對任何所述對象進行的更改?

場景:

  • A,B和C都是實體
  • A持有對B特定實例的引用,可通過a.getB()進行檢索;
  • C具有B對象的列表,可通過c.getListOfB()檢索
  • 以下是正確的:c.getListOfB()。contains(a.getB())
  • 還測試了以下內容是否為真:a.getB()== c.getListOfB()。get(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立即將OK值再次設置為false:/

在提交到數據庫之前,這會在同一事務中發生。

有人可以這么向我解釋,為什么EntityManager不知道事務中對上述實體已經進行的更改,以及如何確保保留這些更改嗎? 這導致我進行了漫長的錯誤搜尋,而實際上我對如何在網上找到任何有用的結果一無所知。

編輯:問題是,當我使用.isEmpty()方法實例化列表時,JPA再次從DB中讀取了子對象,將我已經對其事務中的一個子對象所做的更改還原。 我覺得應該已經知道子對象之一已經在持久性上下文中,並且沒有弄亂它。

我目前正在通過調用c.getListOfB()。isEmpty()解決此問題,即在對b進行更改之前實例化List,但這並不是一個令人滿意的解決方案,更不用說對該問題的解釋了。

將變量設為靜態,以便使用相同的實例。

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

比較兩個對象時,請使用equals()方法而不是“ ==”

==將比較對象引用。

equals()比較對象屬性。

在您的情況下,您需要比較該對象的主鍵,該主鍵是實體對象的一個​​屬性。

以下是正確的:c.getListOfB()。contains(a.getB())

以下內容也適用:a.getB()。equals(c.getListOfB()。get(properIndex))

不確定hibernate在調用a.getB()和c.getListOfB()。get(properIndex)時是否會返回相同的引用實例,因此在比較兩個對象屬性時不要使用==

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM