Hibernate事务管理

本文记录Java学习过程中遇到的Hibernate的事务管理~

在Hibernate中,可以通过代码来操作管理事务,如通过"Transaction tx = session.beginTransaction();"开启一个事务;持久化操作后,通过"tx.commit();"提交事务;如果事务出现异常,又通过"tx.rollback();"操作来回滚事务。

除了在代码中对事务开启,提交和回滚操作外,还可以在Hibernate的配置文件中对事务进行配置。配置文件中,可以设置事务的隔离级别。其具体的配置方法是在hibernate.cfg.xml文件中的<session-factory>标签元素中进行的。配置方法如下所示:

<!--
	事务隔离级别:
	1-Read uncommited isolation
	2-Read commit isolation
	4-Repeatable read isolation
	8-Serializable isolation
-->
<property name="hibernate.connection.isolation">4</property>

真正进行事务管理的时候,需要考虑事务的应用场景,也就是说事务控制不应该是DAL层实现的,应该在Service层实现,并且在Service中调用多个DAL实现一个业务逻辑的操作。

其实最主要的是如何在Service中开启事务时使用的Session对象和DAO中多个操作使用的是同一个Session对象。

有两种实现方案:

  • 在业务层获取到Session,并将Session作为参数传递给DAO;
  • 可以使用TreadLocal将业务层获取的Session绑定到当前线程中,然后在DAO中获取Session的时候,都从当前线程中获取。

第二种方式肯定是最优方案,Hibernate的内部已经将这个事情做了,我们只需要配置下。

Hibernate中提供了三种管理Session对象的方法:

  • thread:Session对象的生命周期与本地线程绑定;
  • jta:Session对象的生命周期与JTA事务绑定;
  • managed:Hibernate委托程序管理Session对象的生命周期。

配置方式如下:

<property name="hibernate.current_session_context_class">thread</property>

hibernate提供sessionFactory.getCurrentSession()创建一个session与ThreadLocal绑定。

而且,Hibernate中提供的这个与线程绑定的Session可以不用关闭,当线程执行结束后,就会自动关闭了。

标签: none