You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring/Hibernate版本迁移后出现TransactionRequiredException异常求助

解决Spring 5/Hibernate 5迁移后的TransactionRequiredException异常

我太懂这种版本迁移后“明明没改业务代码却炸了”的憋屈了——从Spring 4.3.9/Hibernate 4.3.6跳到Spring 5.0.4/Hibernate 5.2.14,哪怕只调整了依赖和包名,也可能因为框架底层的隐性变化踩坑。针对你遇到的javax.persistence.TransactionRequiredException: no transaction is...异常,结合我踩过的同类坑,给你梳理几个最可能的原因和解决办法:

  • 检查事务管理器的全类名是否同步更新
    你提到已经把代码里的包名改为hibernate5,但一定要确认配置文件(不管是JavaConfig还是XML)里的事务管理器类是否也跟着更新:
    旧的Spring4+Hibernate4版本配置:

    @Bean
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
        return new org.springframework.orm.hibernate4.HibernateTransactionManager(sessionFactory);
    }
    

    升级到Spring5+Hibernate5后必须改为:

    @Bean
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
        return new org.springframework.orm.hibernate5.HibernateTransactionManager(sessionFactory);
    }
    

    如果是XML配置,对应的<bean>的class属性也要从org.springframework.orm.hibernate4.HibernateTransactionManager改成org.springframework.orm.hibernate5.HibernateTransactionManager。这个是最容易忽略的细节,很多人改了业务代码的导入包,却忘了配置里的类路径。

  • 确认Hibernate会话上下文配置正确
    Hibernate5和Spring集成时,必须指定会话上下文为Spring提供的实现,否则事务无法正确绑定到当前线程。检查你的LocalSessionFactoryBean配置中的hibernateProperties,确保包含:

    hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
    

    之前Hibernate4用的是org.springframework.orm.hibernate4.SpringSessionContext,这个必须跟着版本同步更新,否则Hibernate无法识别Spring管理的事务上下文,自然会抛出无事务的异常。

  • 排查依赖冲突问题
    版本迁移最容易埋坑的就是依赖冲突——你的项目里可能还残留着Hibernate4的hibernate-core、hibernate-entitymanager等依赖,或者Spring相关组件版本不统一。用依赖分析工具查一下:
    Maven用户执行:

    mvn dependency:tree
    

    Gradle用户执行:

    gradle dependencies
    

    确保所有Hibernate相关依赖的版本都是5.2.14.Final,没有4.x版本混入;同时Spring的spring-context、spring-tx、spring-orm等核心依赖必须统一为5.0.4.RELEASE。

  • 验证事务注解的生效情况
    Spring5对AOP代理的默认规则有一些调整,比如如果你的业务类是final的,或者事务方法是private的,@Transactional注解可能不会被正确织入。另外,确认你的配置类上有没有@EnableTransactionManagement注解(JavaConfig场景),或者XML配置里有没有<tx:annotation-driven/>标签。如果需要用AspectJ织入事务,还要确保spring-aspects依赖已经正确引入,并且织入配置生效。

如果以上方法都试过还是没解决,建议你开启Spring事务的DEBUG级别日志,查看事务的创建、绑定和销毁过程——日志里会清晰显示事务是否成功开启,EntityManager是否绑定到了当前事务上下文,能帮你精准定位问题出在哪一环。

内容的提问来源于stack exchange,提问作者user871199

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:35:13