专栏首页IT笔记springMvc4+hibernate4的一个奇葩的网上众说纷纭的错误

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

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

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)

Dao层session的获取的方式如下

@Autowired
    private SessionFactory sessionFactory;

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

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

<!-- 配置 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()获取不到-->

<!-- 定义事务规则 -->
   <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>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊一聊项目中的Spring(execution表达式)

    [一知半解,就是给自己挖坑],开篇先补充一下事务的相关知识。 编程式事务 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。管理使用T...

    小柒2012
  • Spring3+Hibernate3升级为Spring4+Hibernate4

    写在开始 今天,把当前项目做了一下升级,特此记录一下。 由于历史原因,项目本身并不是Maven项目,所以升级JAR包都是手动从Maven库中下载,然后load进...

    小柒2012
  • Python学习案例之图片人脸检测识别

    随着科技的发展,人脸识别技术在许多领域得到的非常广泛的应用,手机支付、银行身份验证、手机人脸解锁等等。

    小柒2012
  • [android] 加载大图片到内存

    默认情况下,android程序分配的堆内存大小是16,虚拟机上面的VM Heep就是设置它的

    陶士涵
  • MII2RGMII IP核使用设计举例

    本例程将 PS 的 ETH1 通过 EMIO 方式引出, 通过 EMIO 引出的 ETH 为 GMII 接口, 将其与 GMII to RGMII IP 核连接...

    碎碎思
  • 到底该用img还是background-image?

    在前端页面的实现过程中,我们经常会遇到这个情况:有一个盒子,盒子里面需要放一张图片。这个时候,我们既可以通过添加image标签来实现,也可以通过设置背景图的形式...

    木子墨
  • mysql主从复制

    由于我这里使用docker搭建,所以需要把配置文件和数据文件映射到宿主机,让容器运行时挂载数据

    用户1637228
  • macOS Sierra安装Apache2.4+PHP7.0+MySQL5.7.16

    Mac系统上虽然自带PHP和Apache,但是有时不是我们想要的版本呢。今天我们就在macOS Sierra(10.12.1)上安装比较新的版本的PHP版本,也...

    lizelu
  • 牛!何恺明包揽2项ICCV 2017最佳论文奖!这位高考状元告诉你什么是开挂的人生

    大神终究是大神! 刚刚,AI 科技大本营获悉,继两次荣获 CVPR 最佳论文奖之后,何恺明参与的两篇最新论文又分别摘下 ICCV 2017 的最佳论文奖(Bes...

    AI科技大本营
  • Jetson TX1开发笔记(六):V4L2+OpenCV3.1以MJPG格式读取USB摄像头图像并实时显示

    嵌入式平台(Target): Jeston TX1 OpenCV: OpenCV3.1 摄像头: USB 800W摄像头 1 前言     博主手中的...

    Jack_Cui

扫码关注云+社区

领取腾讯云代金券