2016-02-26 79 views
2

當I java.persistence.EntityManger.find()是一個@Entity時,EntityManager會檢查事務是否存在與其關聯的持久性上下文的現有實例。如果如果搜索的是存在於上下文中的實體中的一個存在,那麼如何對JPA實體進行實際跟蹤

  1. ,那就是如果被搜索的實體是什麼返回EntityManager.find
  2. 的主叫方不存在背景,然後從EntityManager的數據源得到它,並把它在那裏,然後就是什麼返回到EntityManager.Find

的呼叫者,而如果交易不包含經理的相關持久化上下文的現有實例,那麼管理者創建一個,將其與事務相關聯,在數據源中找到該實體,並將其添加到該上下文中進行管理,然後將該實體返回給find的調用者。

- >結果是相同的,調用者現在有一個存在於持久化上下文中的託管實體。 (重要的是:持久性上下文被附加到事務中,所以如果事務在客戶端獲得了「被管理」實體的地方結束,那麼持久化上下文不再是實體,並且該實體被「分離」了不再管理)。

現在,當我在@entity實例中使用setter或其他內部狀態更改方法進行狀態更改時,會跟蹤這些更改,因爲我的實體是持久性上下文的一部分,當事務最終提交時它將被刷新到數據源。我的問題是如何跟蹤狀態變化並通過什麼進行跟蹤?如果我通過某個中間對象進行更改,則該中間對象可以相應地更新持久化上下文,但我不是(或者我?)。我直接使用我的@entity註釋對象進行更改。那麼如何跟蹤這些變化。

也許有些事件正在被聆聽?聽什麼?我正在閱讀關於這個主題的書籍和文章,但是我不能把這一點搞砸。

+1

這就是所謂的「髒檢查」。現在,將新學習的關鍵字與「jpa」或「hibernate」或任何您正用作附加關鍵字的impl結合使用。它有沒有產生有益的答案?一般來說,它歸結爲代理模式。 – BalusC

+0

謝謝。完善。 – naftalimich

+0

可能的重複:http://stackoverflow.com/questions/8507922/jpa-dirty-checking – BalusC

回答

3

在實體生命週期中,jpa供應商的內部實現跟蹤狀態更改。

髒檢查策略是供應商特定的。可以通過字段比較或字節碼增強來完成,如發佈在JPA dirty checking中。

儘管它是特定於供應商的,但PersistentContext會在狀態同步期間,在刷新或提交時注意到狀態更改。

重要的是要記住刷新可以做所有的點是非常重要的:

  • 手動
  • 之前查詢
  • 之前提交