hibernate 版本(version)控制

2021-08-26 21:29:00 字數 1784 閱讀 3003

hibernate支援樂觀鎖。當多個事務同時對資料庫表中的同一條資料操作時,如果沒有加鎖機制的話,就會產生髒資料(duty data)。hibernate有2種機制可以解決這個問題:樂觀鎖和悲觀鎖。這裡我們只討論樂觀鎖。

hibernate樂觀鎖,能自動檢測多個事務對同一條資料進行的操作,並根據先勝原則,提交第乙個事務,其他的事務提交時則丟擲org.hibernate.staleobjectstateexception異常。

hibernate樂觀鎖是怎麼做到的呢?

column="version"

type="integer"/>

告訴hibernate version作為版本控制用,交由它管理。

當然在entity class裡也需要給version加上定義,定義的方法跟其他字段完全一樣。

private integer version;

…// setversion() && getversion(integer)

hibernate樂觀鎖的的使用:

session session1 = sessionfactory.opensession();

session session2 = sessionfactory.opensession();

myentity et1 = session1.load(myentity.class, id);

myentity et2 = session2.load(myentity.class, id);

//這裡 et1, et2為同一條資料

transaction tx1 = session1.begintransaction();

//事務1開始

et1.setname(「entity1」);

//事務1中對該資料修改

tx1.commit();

session1.close();

//事務1提交

transaction tx2 = session2.begintransaction();

//事務2開始

et2.setname(「entity2」);

//事務2中對該資料修改

tx2.commit();

session2.close();

//事務2提交

在事務2提交時,因為它提交的資料比事務1提交後的資料舊,所以hibernate會丟擲乙個org.hibernate.staleobjectstateexception異常。

回到前面的問題,hibernate怎麼知道事務2提交的資料比事務1提交後的資料舊呢?

因為myentity有個version版本控制字段。

回頭看看上面的源**中的:

myentity et1 = session1.load(myentity.class, id);

myentity et2 = session2.load(myentity.class, id);

這裡,et1.version==et2.version,比如此時version=1,

當事務1提交後,該資料的版本控制欄位version=version+1=2,而事務2提交時version=1<2所以hibernate認為事務2提交的資料為過時資料,丟擲異常。

這就是hibernate樂觀鎖的原理機制。

我們已經知道了hibernate樂觀鎖是根據version的值來判斷資料是否過時,也就是說,在向資料庫update某資料時,必須保證該entity 裡的version欄位被正確地設定為update之前的值,否則hibernate樂觀鎖機制將無法根據version作出正確的判斷。

在我們的web應用中,尤其應該注意這個問題。

第乙個hibernate程式(xml版本)

1.在使用hibernate3.3 的時候使用的包的配置情況 a.b color orange hibernate3.jar color b 這是hibernate的核心包。b.在lib資料夾中的required包中所用的jar包 img c.關於日誌的包,我們需要slf4j的日誌包,需要注意的是需...

Hibernate 檢索策略

在預設情況下,當hibernate從資料庫中載入物件時,會同時載入所有關聯的物件.但實際應用中可能不需要使用其關聯的物件,這樣就可能通過設定hibernate的檢索策略,來優化檢索效能.hiberante提供了3種檢索策略 1 立即檢索 2 延遲檢索 3 迫切左外連線檢索 下面先從概念上去理解,先在...

Hibernate游標超值

配置檔案 on close auto default on close after transaction after statement preparedstatement pst null resultset rs null session session getsession string q...