[英]Are entities fetched outside transaction managed or detached?
我一直認為,在事務處理之前(在entityManager.getTransaction().begin()
)獲取的實體與持久性上下文分離(同時使用相同的實體管理器來獲取處理事務的實體)。 實際上,每次我管理事務時,我都必須顯式合並從其外部獲取的實體。 如果沒有,更新將不會反映在數據庫中。
但是最近,我和一位經歷相反情況的同事進行了討論。 他必須明確分離事務之前獲取的每個實體,以避免更新數據庫。
我們的代碼之間的唯一區別是,我的persistence.xml
文件是2.0版,而他的文件是1.0版。 但是他在代碼中使用的是JPA 2.1。 是這種奇怪行為的原因,還是我在這里缺少什么?
我們都使用Hibernate作為實現。
PersistenceContext可能有兩個作用域:
交易范圍
僅在EntityManager由容器管理時發生。 在這種情況下,只要存在當前事務,就可以激活當前PersistenceContext。
擴展范圍
在EntityManager由應用程序管理(默認)或容器管理(EntityManager需要注釋: @PersistenceContext( type=PersistenceContextType.EXTENDED)
)時發生。
長話短說:EXTENDED-SCOPE表示當前的PersistenceContext生存時間與您的bean生存時間一樣長。
事物是否以及如何自動融合到交易環境中取決於幾個因素。 使用的JPA實現,持久性上下文范圍以及使用的事務隔離。 如果不看整個環境,就很難回答。 我假設您的應用程序允許非事務性讀取(臟讀取,幻像讀取,不可重復讀取),因此您被“允許”決定是否要合並。 另一個解釋可能是您的應用程序代碼混合了多個持久性上下文,因此需要您將在一個持久性上下文中讀取的實體合並到另一個持久性上下文(開始TX的上下文)中。
他們將得到管理。 任何更改將在下一次flush
反映到數據庫。 事務提交以及事務前操作排隊的更改會立即被刷新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.