2016-11-22 75 views
1

我只是想知道Hibernate如何識別對象是否是分離的實體。我沒有要求任何具體的方法,只是想了解背後的機制。檢查休眠中的獨立實體

+0

基本上,每個會話都有一個包含該會話中所有實體的IdentityHashMap。 –

+0

我不確定這是個好問題。在StackOverflow上,你應該證明你已經努力瞭解自己。要回答這個問題的唯一方法是閱讀Hibernate的源代碼,以確切瞭解他們是如何做到的。我們中的任何一個人都可能會說或者說我們會怎麼做,但是沒有閱讀源代碼,沒有人會知道答案。 Tuan,你有沒有試過在源代碼中發現自己?如果是這樣,你有多遠?當然,JB Nizet是對的,這可能是他們如何做到的,或者JB Nizet是一個Hibernate開發人員,而這正是他們如何做到的。 – DavidS

+1

我不是Hibernate開發人員,我查看了源代碼。 –

回答

1

從JBoss的文檔:

獨立式 - 一個脫管的實例是,一直堅持不懈, 一個對象,但它的Session已經被關閉。對象的引用仍然是 當然有效,並且分離的實例甚至可能在此狀態下被修改爲 。分離的實例可以在稍後的時間點重新附加到新的會話 ,使其(以及所有修改) 再次持久。此功能可爲需要用戶思考時間的長時間運行的工作單元啓用編程模型。我們稱它們爲應用程序事務,即從用戶的角度 開始的一個工作單元。

,因爲Hibernate基本上跟蹤會話和連接對象。 任何與該會話關聯的對象都將被分離,並變得像其他任何POJO一樣。

那麼Hibernate並不爲:

  1. 呼籲session.evict()的對象引用或session.clear()從會議中刪除的對象。
  2. Hibernates持久性管理器依賴於存在的標識符來確定對象的狀態。如果一個對象有一個標識符,那麼這個對象就是Persistent,如果它不屬於一個會話,那麼它是DETACHED
  3. 打開新會話後,可以將分離的對象重新關聯並同步到數據庫。
  4. 調用上的獨立式對象引用session.update()session.saveOrUpdate()轉變的分離對象持久狀態
  5. 當一個獨立對象是重新掛接數據庫更新對象的當前狀態;以包括處於分離狀態時所做的更改。

一個很好的參考可以找到here

+0

@TimBiegeleisen是的,對不起,正在不斷編輯。現在更新了答案。 –