Hibernate事務(wù)管理
Hibernate是JDBC的輕量級封裝,本身并不具備事務(wù)管理能力,在事務(wù)管理層,Hibernate將其委托給底層的JDBC或者JTA,以實(shí)現(xiàn)事務(wù)的管理和調(diào)度。
Hibernate的默認(rèn)事務(wù)處理機(jī)制基于JDBCTransaction,也可以通過配置文件設(shè)定采用JTA作為事務(wù)管理實(shí)現(xiàn):
<hibernate-configuration>
<session-factory>
……
<property name = "hibernate.transaction.factory_class">
net.sf.hibernate.transaction.JTATransactionFactory
</session-factory>
</hibernate-configuration>
1、基于JDBC的事務(wù)管理
Hibernate對于JDBC事務(wù)的封裝非常簡單。例如:
session=sessionFactory.openSession();
Transaction tx= session.beginTransaction();
……
tx.commit();
這里要注意的是,在sessionFactory.openSession()中,Hibernate會初始化數(shù)據(jù)庫連接,與此同時,將其 AutoCommit設(shè)為關(guān)閉狀態(tài),這就是說,從SessionFactory獲得session,其自動提交屬性就已經(jīng)被關(guān)閉了,下面的代碼不會對事務(wù)性數(shù)據(jù)庫產(chǎn)生任何效果。
session=sessionFactory.openSession();
session.save(user);
session.close();
如果要使得代碼真正作用到數(shù)據(jù)庫,必須顯示的調(diào)用Transaction指令
session=sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
session.close();
2、基于JTA的事務(wù)管理
JTA提供了跨Session的事務(wù)管理能力,這是與JDBCTransaction最大的差異。
JDBC事務(wù)由Connection管理,也就是說,事務(wù)管理實(shí)際上是在JDBC Connection中實(shí)現(xiàn),事務(wù)周期限于Connection的生命周期之內(nèi),對于基于JDBC Transaction的Hibernate事務(wù)管理機(jī)制,事務(wù)管理在Session所依托的JDBC Connection中實(shí)現(xiàn),事務(wù)周期限于Session的生命周期。
JTA事務(wù)管理由JTA容器實(shí)現(xiàn),JTA容器對當(dāng)前加入事務(wù)的眾多Connection進(jìn)行調(diào)度,實(shí)現(xiàn)其事務(wù)性要求,JTA的事務(wù)周期可橫跨多個JDBC Connection生命周期,同樣,對基于JTA事務(wù)的Hibernate,JTA事務(wù)橫跨多個Session。需要注意的是,參與JTA事務(wù)的 Connection需避免對事務(wù)管理進(jìn)行干涉,如果采用JTA Transaction,就不應(yīng)該再調(diào)用Hibernate的Transaction功能。