2014-03-29 81 views
3

假設我們有一個爲他們每個人的兩個實體依賴於彼此和DAO關於線程安全和JPA的EntityManager

Entity1 -> * Entity2 
Entity2 

現在,我們有兩個線程是拉從數據庫中的一些數據,線程1問Entity1Dao得到一些對象初始化了依賴字段,同時Thread2嘗試使用Entity2Dao獲得相同的Entity2對象(已經檢索到)。

Entity1Dao創建EntityManager(em1)並檢索數據,Entity2Dao將創建不同的EntityManager(em2)以從數據庫中獲取查詢對象。

問題:在em1關閉之前em2是否鎖定?如果不是,我們應該在「包含請求對象的其他entitymanager」上得到例外嗎?

回答

4

否。每個EntityManager都會返回實體的不同實例。

然後併發事務可能會寫入相同的行,最後一個將會獲勝,除非實現樂觀併發(通過向您的實體添加@Version字段)。

+0

感謝您的回答,您是否也可以回答這個問題。假設我有一些Object(附加)表單實體管理器,後來關閉了em,那個對象是否仍然連接? – vach

+0

不可以。如果關閉'em',那麼'em'管理的所有對象都將不受管理。 –

+0

我試圖爲我的應用程序實現數據訪問層,並且只有這樣,我才發現使它成爲線程安全的方法是使用entityManager每個事務,因此如您所說,從dao返回的任何對象都將變爲非託管。有沒有更好的方法來做到這一點? – vach