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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:35:35