`
shellfj
  • 浏览: 46604 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Spring Hibernate 事务管理配置问题

    博客分类:
  • J2EE
阅读更多
练习个项目,发现执行到dao层里的方法时总是抛org.hibernate.HibernateException:xxxxx is not vaild without active transaction.    例如执行session.save(xxxEntity) 就抛出 save is not vaild without active transaction.

        找到好多的教程都说是要在配置hibernateProperties时加一条:

                      如果采用jdbc独立引用程序配置如下:
                        <property name="hibernate.current_session_context_class">thread</property>
                     如果采用了JTA事务配置如下
                         <property name="hibernate.current_session_context_class">jta</property>
      注:真实情况是加了不一定好用,需要理解正确才能判断出到底加还是不加。

         理解为在事务管理时,session所处容器(环境)。

        就是说用sessionFactory的getCurrentSession()得到的那个session总是位于容器里的同一个实例。这样,在业务层管理的一个方法(对应一个事务)中执行的多条dao层方法(每个方法都会去打开currentSession) 中用的是一个session。 容器会管理它的生命周期,我们就不用手动的去close 掉session.   这也是通常用getCurrentSession. 不用openSession方法打开一个新session的原因。

      请理解上面这段话。当你用spring为业务层管理事务时,无论你用@Transactional注解,还是配置在spring的xml文件中,你都会发现加了上面的那句配置会导致抛出org.hibernate.HibernateException:xxxxx is not vaild without active transaction。

       你会纳闷:明明设置了事务管理啊~!还是spring的事务管理,名角儿,怎么能说没有活动的事务设置呢? 这是因为session 和transaction不在同一个容器(环境)里造成的。session是在普通的thread里,而transaction是spring的context里。 我感觉,后者范围小一些,到不了thread里去为其session进行事务管理,所以session找不到事务。怎么办?

        很简单,去掉那行hibernate.current_session_context_class的配置。这样session就交给spring的context了。

       PS:找了半天的相关文章找不到一个解决方法,终于发现http://blog.csdn.net/javavenus/archive/2010/08/12/5806164.aspx里有,看过后才大彻大悟,遂改了程序,运行成功后,总结于此
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics