自定义SessionFactory下@Transactional注解失效问题及解决诉求
问题解决:自定义SessionFactory下让@Transactional注解生效
问题根源
你设置了hibernate.current_session_context_class=thread,这会强制Hibernate使用自身的线程绑定Session上下文,完全绕过Spring的事务管理机制。Spring的@Transactional注解无法接管这种情况下的Session事务,所以调用persist时会抛出无活跃事务的异常。
解决方案
1. 修改SessionFactory配置,移除Hibernate自带的Session上下文配置
删除configuration.setProperty("hibernate.current_session_context_class", "thread");这行代码,让Spring自动使用SpringSessionContext来管理Session生命周期。
修改后的SessionFactory Bean代码:
@Bean public SessionFactory sessionFactory() { SessionFactory sessionFactory; Configuration configuration = new Configuration(); HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver"); hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/hibernate"); hikariConfig.setUsername("root"); hikariConfig.setPassword("password"); hikariConfig.setMinimumIdle(5); hikariConfig.setMaximumPoolSize(20); hikariConfig.setConnectionTimeout(30000); hikariConfig.setIdleTimeout(300000); hikariConfig.setMaxLifetime(1800000); // 移除Hibernate自带的Session上下文配置 configuration.setProperty("hibernate.show_sql", "true"); configuration.setProperty("hibernate.hbm2ddl.auto", "update"); sessionFactory = new LocalSessionFactoryBuilder(new HikariDataSource(hikariConfig)) .scanPackages("com.entity") .addProperties(configuration.getProperties()) .buildSessionFactory(); return sessionFactory; }
2. 配置Spring的Hibernate事务管理器
添加HibernateTransactionManager Bean,将自定义的SessionFactory注入进去,让Spring事务管理器和你的SessionFactory绑定:
@Bean public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { HibernateTransactionManager transactionManager = new HibernateTransactionManager(); transactionManager.setSessionFactory(sessionFactory); return transactionManager; }
3. 开启Spring注解驱动的事务管理
在你的配置类(或启动类)上添加@EnableTransactionManagement注解,开启Spring对@Transactional注解的支持:
@Configuration @EnableTransactionManagement public class HibernateConfig { // 上述SessionFactory和transactionManager Bean定义在此 }
原理说明
- 移除Hibernate自带的Session上下文配置后,Spring会自动将Hibernate的Session上下文替换为
SpringSessionContext,确保Session的生命周期由Spring事务管理器控制。 HibernateTransactionManager是Spring专门为Hibernate实现的事务管理器,它会监听@Transactional注解,在方法执行前开启事务、绑定Session,方法执行完成后提交或回滚事务。@EnableTransactionManagement注解触发Spring的事务代理逻辑,让@Transactional注解真正生效。
内容的提问来源于stack exchange,提问作者random guy
相关产品推荐
相关产品推荐

