![](/img/trans.png)
[英]I want to save two entities in one transaction with JPA if any error occure while inserting the data the changes should be rolled back
[英]Java - JPA - Instantiating a List of child entities reverts changes already made to one of them within the transaction
為什么打開一個未實例化的(實體)對象列表,為什么會還原同一事務中已經對任何所述對象進行的更改?
場景:
如果我在交易中執行以下操作:
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.