2014-01-22 49 views
1

我正在使用ThreadLocal和請求/實體模式獲取entites。這種方式發生,我關閉了一個entityManager,並在我編輯的背景中有實體,複製這樣的修改,並在它之後,我想要堅持或合併一個新的entityManager。我不知道這是一個合法或合理的解決方案!當關閉相關的(相同的)entityManager時,那些先前由entityManager發現或得到的內容呢?

我發現沒有文章,問題,關於這個問題的答案。也許我太瞭解了,但想知道是否有一些已知的問題,或者以這種方式關閉entityManager時出現問題......(我想可能相關實體在歸零後關閉它)

我管理entite RESOURCE_LOCAL方式。

或?如果我感覺良好:entityManager只是持久性上下文的橋樑/路徑,並且entityManagers可以被替換,則管理實體和entityManager(從這個意義上)之間沒有真實或嚴格的綁定...

回答

1

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

+0

非常感謝大衛,我感謝你的例子代碼和你的快速答案。無論如何,你能幫我解決最後一個問題嗎?你從哪裏得到你的信息?在經驗中還是有關於JPA的非常詳細的文章/描述?我已經閱讀了甲骨文的Jave EE教程,但它看起來很淺,在JPA中對我來說不是很深...(並且關於這個主題也有點短小) – czupe

+0

無論如何添加了標記並接受它!謝謝! – czupe

+2

我對這本書非常依賴(不幸的是不幸):http://www.amazon.com/Pro-JPA-Mastering-Persistence-Technology/dp/1430219564請參閱第6章中的「分離和合並」一節。 –

相關問題