Hibernate中的事务管理:
在Hibernate的配置文件中对事务进行配置,配置文件Hibernate.cfg.xml中,可以设置事务的隔离级别。
事务的隔离级别:
hibernate.connection.isolation=4
1----Read uncommitted isolation
2----Read committed isolation
4----Repeatable read isolation
8----Serializable isolation
在Hibernate.cfg.xml中进行如下配置:
Hibernate解决Service的事务管理:
事务控制不应该是在DAO层实现的,应该在Service层实现,并且在Service中调用多个DAO实现一个业务逻辑的操作。所以如何保证在Service中开启的事务时使用的Session对象和DAO中多个操作使用的是同一个Session对象。
其中有两种办法可以实现:
*可以在业务层获取到Session,并将Session作为参数传递给DAO
*可以使用ThreadLocal将业务层获取的Session绑定到当前线程中,然后在DAO中获取Session的时候,都从当前线程中获取。
其中第二种是最优方案,在Hibernate内部已经将这个事情做完了,我们只需要完成一段配置即可。
Hibernate5中自身提供了三种管理Session对象的方法:
*Session对象的生命周期与本地线程绑定
*Session对象的生命周期与JTA事务绑定
*Hibernate委托程序管理Session对象的生命周期
在Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Session管理方式,可选值包括
*thread:Session对象的生命周期与本地线程绑定
*jta:Session对象的生命周期与JTA事务绑定
*managed:Hibernate委托程序来管理Session对象的生命周期
Hibernate提供sessioniFactory.getCurrentSession()创建一个session和ThreadLocal绑定。
在HibernateUtils工具类中更改getCurrentSession方法:
public static Session getCurrentSession() {
return sf.getCurrentSession();
}
配置完成。