前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springMvc4+hibernate4的一个奇葩的网上众说纷纭的错误

springMvc4+hibernate4的一个奇葩的网上众说纷纭的错误

作者头像
小柒2012
发布2018-04-13 16:36:07
5430
发布2018-04-13 16:36:07
举报
文章被收录于专栏:IT笔记IT笔记

springMvc4+hibernate4项目运行报错如下:

代码语言:javascript
复制
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)

Dao层session的获取的方式如下

代码语言:javascript
复制
@Autowired
    private SessionFactory sessionFactory;

    protected Session session() {
        return sessionFactory.getCurrentSession();
    }

spring-context.xml中配置的是注解事务

代码语言:javascript
复制
<!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务  -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

网上居然有人说hibernate4不支持hibernate3的 getcurrentSession,建议你用openSession。 的确使用openSession就不会报错了,但这种说法显然是误导大众了。hibernate4 也支持getcurrentSession 会自动关闭session,如果使用openSession 要自己手动关闭。并且自己openSession就不属于hibernate4管理了,每查一次就手动关一次。

使用 hibernate4,在不使用OpenSessionInView模式时,在使用getCurrentSession()时会有如下问题:

当有一个方法list 传播行为为Supports,当在另一个方法getPage()(无事务)调用list方法时会抛出org.hibernate.HibernateException: No Session found for current thread 异常。 这是因为getCurrentSession()在没有session的情况下不会自动创建一个,不知道这是不是Spring3.1实现的bug,欢迎大家讨论下。

<!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到-->

代码语言:javascript
复制
<!-- 定义事务规则 -->
   <tx:advice id="txAdvice" transaction-manager="transactionManager">
       <tx:attributes>
           <tx:method name="save*" propagation="REQUIRED" />
           <tx:method name="add*" propagation="REQUIRED" />
           <tx:method name="create*" propagation="REQUIRED" />
           <tx:method name="insert*" propagation="REQUIRED" />
           <tx:method name="update*" propagation="REQUIRED" />
           <tx:method name="merge*" propagation="REQUIRED" />
           <tx:method name="del*" propagation="REQUIRED" />
           <tx:method name="remove*" propagation="REQUIRED" />
           <tx:method name="put*" propagation="REQUIRED" />
           <tx:method name="gen*" propagation="REQUIRED" />
           <tx:method name="complete*" propagation="REQUIRED" />
           <tx:method name="import*" propagation="REQUIRED" />
           <tx:method name="open*" propagation="REQUIRED" />
           <tx:method name="publish*" propagation="REQUIRED" />
           <tx:method name="init*" propagation="REQUIRED" />
           <tx:method name="change*" propagation="REQUIRED" />
           <tx:method name="*Change*" propagation="REQUIRED" />
           <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到-->  
           <tx:method name="*" propagation="REQUIRED" read-only="true" />
       </tx:attributes>
   </tx:advice>
   <!-- 定义事务入口 -->
   <aop:config>
       <aop:pointcut id="txPointcut" expression="execution(* com.acts.web.modules.*.service.*.*(..))" />
       <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
   </aop:config>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档