Spring/Hibernate版本迁移后出现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:treeGradle用户执行:
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

