When你關閉一個EntityManager,它的所有被管實體變成分開。沒有什麼不妥。您仍然可以使用分離的實體作爲java對象,但更改它們的屬性不會影響數據庫(除非重新附加它)。同樣,一旦一個實體被分離,你不能再遵循在實體仍然連接時尚未初始化的延遲加載的關係。
您可以稍後通過調用其上的merge()
方法將分離的實體重新附加到不同的EntityManager。例如:
// Here myEntity is managed by entityManager1.
SomeEntity myEntity = entityManager1.find(SomeEntity.class, id);
// myEntity becomes detached.
entityManager1.close();
// I can still work with the java object.
myEntity.setSomeProperty("blah");
// Here myEntity becomes managed by entityManager2.
// It basically retrieves the current entity from the DB (based on its ID),
// then apply any change that was made to it while it was detached.
myEntity = entityManager2.merge(myEntity);
// If you commit at this point, the changes made to myEntity while
// it was detached will be persisted to the DB.
防止發生變更時數據庫「你背後」,而在實體分離(例如,另一個應用程序修改相應的行),你可以使用一個@Version場的情況。每次修改實體時,其版本都會發生變化。如果您嘗試合併分離的實體,並且從數據庫中檢索的當前版本具有不同的版本,則會拋出OptimisticLockException
。
非常感謝大衛,我感謝你的例子代碼和你的快速答案。無論如何,你能幫我解決最後一個問題嗎?你從哪裏得到你的信息?在經驗中還是有關於JPA的非常詳細的文章/描述?我已經閱讀了甲骨文的Jave EE教程,但它看起來很淺,在JPA中對我來說不是很深...(並且關於這個主題也有點短小) – czupe
無論如何添加了標記並接受它!謝謝! – czupe
我對這本書非常依賴(不幸的是不幸):http://www.amazon.com/Pro-JPA-Mastering-Persistence-Technology/dp/1430219564請參閱第6章中的「分離和合並」一節。 –