2011-11-13 22 views
11

我正在通過hibernate的lock method。我沒有得到我們想通過這種方法實現的目標。休眠中session.lock方法的用途

p1 = (Person)session. get(Person.class,1);// person name is scott here 
// here peson name got update to henry by anothet thread 
session. lock(person, LockMode.READ) line 3 
// still name is henry too 

我想上面的代碼片段,但它並沒有從數據庫中讀取行的人3. 文檔中說,這可能被用來執行版本檢查。

不知道它是如何檢查版本,並幫助開發人員在任何情況下?

同樣不知道session.lock(person, LockMode.None)將實現。文檔說LockMode.NONE用於簡單地將瞬態實例與會話重新關聯。

不知道是什麼意思的重新關聯瞬態的實例與會話。一個簡短的情況將是一個很大的幫助?

回答

11

不同鎖定模式是指用於防止實體被修改和來自多個源的同時讀取,細節參見文檔條目約pessimistic locking。根據我的經驗,這些很少用到,因爲數據庫隔離級別通常需要鎖定需要的護理:

這並不意味着用戶花太多的時間去擔心鎖定 策略。通常爲JDBC連接指定一個隔離級別就足夠了,然後讓數據庫完成所有工作。 但是,高級用戶可能希望獲得專有的悲觀鎖 或在新交易開始時重新獲得鎖。

至於「與會話重新關聯瞬態的實例」(實際上,我認爲他們的意思是脫管的實例?),考慮下面的圖片(Hibernate entity lifecycle):

Hibernate entity lifecycle

這是描述從Hibernate community documentation

休眠定義並支持下列對象狀態

  • 瞬態 - 如果剛剛實例化了一個對象,它是暫態的 使用新的操作符,並且它不與Hibernate 會話相關聯。它在數據庫中沒有固定的表示形式,並且沒有分配標識符值 。如果應用程序不再支持 引用,則垃圾收集器將銷燬 。使用Hibernate Session持久化對象 (並讓Hibernate處理需要爲此轉換執行 的SQL語句)。
  • 持久 - 持久 實例在數據庫中具有表示形式和標識符值。 它可能剛剛被保存或加載,但在會話範圍內,根據定義 。 Hibernate將檢測對持久狀態的對象所做的任何更改,並在工作單元完成時將該狀態與數據庫 同步。開發人員不會執行 手動UPDATE語句或DELETE語句,因此應將對象 設爲瞬態。
  • 分離 - 分離的實例是 已持久化的對象,但其Session已關閉。當然,該對象的引用仍然有效,並且分離的實例可能在此狀態下被修改爲 。分離的實例可以在稍後的時間點重新附加到新的會話中,使其(和所有的 修改)再次持久。此功能可以爲需要用戶思考時間的長時間運行工作單元編程 模型。我們 稱它們爲應用程序事務,即從用戶的觀點 的工作單元。