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