2012-03-02 33 views
0

我想第一次使用Hibernate。我需要利用樂觀鎖定,以便第一次提交勝利。我在一個測試項目中通過hibernate管理的版本號的方式研究瞭如何做到這一點。測試項目只使用休眠,無彈簧,所以與數據庫使用的代碼是這樣的:如何正確使用優化鎖定,使用Spring和Hibernate捕獲StaleObjectState異常

get session from sessionfactory 
open transaction 
perform database actions 
commit transaction with error handling 

我的理解是,我可以利用Spring來獲得交易管理和降低代碼的東西像這樣:

perform database actions 

我不知道是什麼:

  1. 如何建立春天可言。我想在註釋上使用XML。只是一個很好的參考鏈接會很棒。
  2. 錯誤處理如何與Spring實現一起出現?我在哪裏可以看到StaleObjectStateException
  3. 什麼是最好的設計結構?我見過所有線程用來與數據庫進行交互的DAO單例,這對我來說似乎是合理的。

回答

1

基本上你只需要爲你的實體添加一個版本字段,你也應該有一個id。

在你的代碼中你需要管理這個版本,即調用你的持久層的代碼在改變實體之前必須首先獲取帶有正確版本號的對象。

Hibernate負責更新版本字段。所以你只需要在它設置的最後一個值上。當更新實體時,hibernate會增加字段,所以你不需要像創建id那樣創建一個序列。

客戶端代碼需要管理staleObjectStateException。發生此異常時,表示該對象已被其他代碼更改或您沒有獲得最新版本。然後你可以決定做什麼:獲取更新的版本並進行更改,向用戶指出如果有UI,則其他人做了更改...

您也可以爲您的實體創建基類始終擁有id和版本字段。請注意,如果版本號是讀寫實體,則版本號非常有用。

最後要註解的版本場@ javax.persistence.Version

其實這是一個JPA的概念也:

private int version; 

    public AbstractReadWriteEntity() {} 

    @javax.persistence.Version 
    @javax.persistence.Column(name = "VERSION") 
    public int getVersion()... 

還要了解它做什麼的分貝水平:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-optimistic