小編給大家分享一下Hibernate事務(wù)的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái),先為長(zhǎng)清等服務(wù)建站,長(zhǎng)清等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為長(zhǎng)清企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
Hibernate是JDBC的輕量級(jí)封裝,本身并不具備事務(wù)管理能力。在事務(wù)管理層,Hibernate將其委托給底層的JDBC或者JTA,以實(shí)現(xiàn)事務(wù)管理和調(diào)度功能。
Hibernate事務(wù)處理機(jī)制基于JDBC Transaction.我們也可以通過(guò)配置文件設(shè)定采用JTA作為事務(wù)管理實(shí)現(xiàn):
…… net.sf.hibernate.transaction.JTATransactionFactory ……
基于JDBC的事務(wù)管理將事務(wù)管理委托給JDBC 進(jìn)行處理無(wú)疑是最簡(jiǎn)單的實(shí)現(xiàn)方式,Hibernate事務(wù)對(duì)于JDBC事務(wù)的封裝也極為簡(jiǎn)單。
我們來(lái)看下面這段代碼:
session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); …… tx.commit();
從JDBC層面而言,上面的代碼實(shí)際上對(duì)應(yīng)著:
Connection dbconn = getConnection(); dbconn.setAutoCommit(false); …… dbconn.commit();
就是這么簡(jiǎn)單,Hibernate并沒(méi)有做更多的事情(實(shí)際上也沒(méi)法做更多的事情),只是將這樣的JDBC代碼進(jìn)行了封裝而已。
這里要注意的是,在sessionFactory.openSession()中,hibernate會(huì)初始化數(shù)據(jù)庫(kù)連接,與此同時(shí),將其 AutoCommit 設(shè)為關(guān)閉狀態(tài)(false)。而其后,在Session.beginTransaction 方法中,Hibernate 會(huì)再次確認(rèn)Connection 的AutoCommit 屬性被設(shè)為關(guān)閉狀態(tài)( 為了防止用戶代碼對(duì)session 的Connection.AutoCommit屬性進(jìn)行修改)。
這也就是說(shuō),我們一開(kāi)始從SessionFactory獲得的session,其自動(dòng)提交屬性就已經(jīng)被關(guān)閉(AutoCommit=false),下面的代碼將不會(huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生任何效果:
session = sessionFactory.openSession(); session.save(user); session.close();
這實(shí)際上相當(dāng)于 JDBC Connection的AutoCommit屬性被設(shè)為false,執(zhí)行了若干JDBC操作之后,沒(méi)有調(diào)用commit操作即將Connection關(guān)閉。如果要使代碼真正作用到數(shù)據(jù)庫(kù),我們必須顯式的調(diào)用Transaction指令:
session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.save(user); tx.commit(); session.close();
以上是“Hibernate事務(wù)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!