Spring和Hibernate的集成的一个要点就是对事务的支持,openSession、getCurrentSession都是编程式事务(手动设置事务的提交、回滚)中重要的对象,HibernateDaoSupport则提供了更方便的声明式事务支持。
Hibernate中最重要的就是Session对象的引入,它是对jdbc的深度封装,包括对事务的处理,Session对象通过SessionFactory来管理,openSession和getCurrentSession是管理session的重要的方法。
openSession和getCurrentSession的根本区别在于有没有绑定当前线程,所以,使用方法有差异:
* openSession没有绑定当前线程,所以,使用完后必须关闭,
* currentSession和当前线程绑定,在事务结束后会自动关闭。
关于事务的边界和传播:
通常情况下事务的边界需要设置在业务逻辑处理层中,但是,如果在一个业务中涉及到多个业务逻辑层之间的方法,且需要在同一个事务中运行,那么,这就涉及到了事务的传播性。
如果使用openSession,就要在dao层的方法中传递session,而这种做法是很糟糕的,首先增加了参数的个数,另外,方法是否需要事务,完全是可以当做一种独立的服务抽离出的。
因为currentSession是线程级别的,所以,只要业务逻辑方法在同一个线程中,就不会担心上面的问题。这也是currentSession的一个优越处之一。
使用currentSession:
1.在配置文件中将线程配置成Thread级别的。
<propertyname="hibernate.current_session_context_class">thread</property>
2.调用sessionFactory的getCurrentSession方法:
publicvoid addUser(User user) {
Session session = null;
try {
session =HibernateUtils.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(user);
Loglog = new Log();
log.setType("操作日志");
log.setTime(new Date());
log.setDetail("XXX");
LogMa