zoukankan      html  css  js  c++  java
  • Hibernate中解决No Hibernate Session bound to thread问题

    引用:忘了

     

    首先是getCurrentSession()与openSession()的区别:

    1、getCurrentSession()与openSession()的区别?

      * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会
      * 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭
    2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
      * 如果使用的是本地事务(jdbc事务)
        <property name="hibernate.current_session_context_class">thread</property>
      * 如果使用的是全局事务(jta事务)
        <property name="hibernate.current_session_context_class">jta</property>

     

    openSession() 与 getCurrentSession() 有何不同和关联呢? 

      在 SessionFactory 启动的时候, Hibernate 会根据配置创建相应的 CurrentSessionContext ,在 getCurrentSession() 被调用的时候,实际被执行的方法是CurrentSessionContext.currentSession() 。在 currentSession() 执行时,如果当前 Session 为空, currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。

     

    那么当使用getCurrentSession()方法时报No Hibernate Session bound to thread问题该怎么办呢?引用自http://www.cnblogs.com/ylhssn/p/5181149.html)

      1、getCurrentSession()是必须提交事务的。所以在用到session.getCurrentSession()的这个方法一定是要配置声明式事务管理。

      2、openSession()恰恰是与以上的方法想法,它不需要提交事务。但是他的资源必须手动关闭。

      所以针对“No Hibernate Session bound to thread”异常的解决方案有两个:

        方案一:将getCurrentSession()改为openSession()。

        方案二:在sessionFactory bean中的hibernateProperties项中配置以下信息:

    1 <prop key="hibernate.current_session_context_class">
    2       thread
    3 </prop>
    4 <prop key="hibernate.transaction.factory_class">
    5   org.hibernate.transaction.JDBCTransactionFactory
    6 </prop>

        在sessionFactory bean中添加以上两条配置信息后,再次运行程序,又报异常!

    org.hibernate.HibernateException: createCriteria is not valid without active transaction 

       已知使用getCurrentSession()方法是必须提交事务的,而在SSH框架中是使用spring配置声明式事务管理的。

      那接下来再次复习一下spring配置声明式事务管理知识,以便查找错误。

    spring配置声明式事务管理

    此处知识回顾引自“一个无聊的人”的“Spring声明式事务配置管理方法”,博主讲的很详细,推荐一看, 传送门

    以下是博文内容截图:

      除此之外还可以使用其他几种方式用spring管理事务,请自行查找资料学习。


      仔细核对项目中的配置信息后,确定事务已配置无误,当前异常信息还是未解决,继续找资料,最终在“如果你报createSQLQuery is not valid without active transaction,请看这里”一文中找到解决方式:

      将hibernate.current_session_context_class的值由Thread改为org.springframework.orm.hibernate2.SpringSessionContext

      至此由使用getCurrentSession()方法引发的异常问题解决!

  • 相关阅读:
    数据库字段太多,批量快速建立实体类方法(适合大量字段建立实体类)
    SQL service 中的 ”输入SQL命令窗口“ 打开了 “属性界面” 回到 ”输入SQL命令窗口“
    计算机软件编程英语词汇集锦
    编程常用英语词汇
    svn上传和下载项目
    当启动tomcat时出现tomcat setting should be set in tomcat preference page
    Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor
    eclipse中选中一个单词 其他相同的也被选中 怎么设置
    Spring Boot的@SpringBootApplication无法引入的问题
    最全的SpringCloud视频教程
  • 原文地址:https://www.cnblogs.com/wucongyun/p/6544590.html
Copyright © 2011-2022 走看看