由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

本文探讨了Spring如何支持Hibernate的事务处理,重点比较了openSession和getCurrentSession的区别,以及它们在事务边界和传播性上的应用。还介绍了HibernateDaoSupport在声明式事务中的作用,并讨论了异常与事务回滚的策略,包括Spring的事务隔离级别。
摘要由CSDN通过智能技术生成

    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
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值