新聞中心
Hibernate有很多值得學習的地方,這里我們主要介紹Hibernate事務,包括介紹在sessionFactory.openSession()中,Hibernate會初始化數(shù)據(jù)庫連接等方面。

Hibernate是JDBC的輕量級封裝,本身并不具備事務管理能力。在事務管理層,Hibernate將其委托給底層的JDBC或者JTA,以實現(xiàn)事務管理和調(diào)度功能。
Hibernate事務處理機制基于JDBC Transaction.我們也可以通過配置文件設定采用JTA作為事務管理實現(xiàn):
- ……
name="hibernate.transaction.factory_class"> - net.sf.hibernate.transaction.JTATransactionFactory
- ……
基于JDBC的事務管理將事務管理委托給JDBC 進行處理無疑是最簡單的實現(xiàn)方式,Hibernate事務對于JDBC事務的封裝也極為簡單。
我們來看下面這段代碼:
- session = sessionFactory.openSession();
- Transaction tx = session.beginTransaction();
- ……
- tx.commit();
從JDBC層面而言,上面的代碼實際上對應著:
- Connection dbconn = getConnection();
- dbconn.setAutoCommit(false);
- ……
- dbconn.commit();
就是這么簡單,Hibernate并沒有做更多的事情(實際上也沒法做更多的事情),只是將這樣的JDBC代碼進行了封裝而已。
這里要注意的是,在sessionFactory.openSession()中,hibernate會初始化數(shù)據(jù)庫連接,與此同時,將其 AutoCommit 設為關閉狀態(tài)(false)。而其后,在Session.beginTransaction 方法中,Hibernate 會再次確認Connection 的AutoCommit 屬性被設為關閉狀態(tài)( 為了防止用戶代碼對session 的Connection.AutoCommit屬性進行修改)。
這也就是說,我們一開始從SessionFactory獲得的session,其自動提交屬性就已經(jīng)被關閉(AutoCommit=false),下面的代碼將不會對數(shù)據(jù)庫產(chǎn)生任何效果:
- session = sessionFactory.openSession();
- session.save(user);
- session.close();
這實際上相當于 JDBC Connection的AutoCommit屬性被設為false,執(zhí)行了若干JDBC操作之后,沒有調(diào)用commit操作即將Connection關閉。如果要使代碼真正作用到數(shù)據(jù)庫,我們必須顯式的調(diào)用Transaction指令:
- session = sessionFactory.openSession();
- Transaction tx = session.beginTransaction();
- session.save(user);
- tx.commit();
- session.close();
分享題目:Hibernate事務全面介紹
本文網(wǎng)址:http://fisionsoft.com.cn/article/dpjidcd.html


咨詢
建站咨詢
