【问题标题】:Spring Boot 2.5 Hibernate error: Could not obtain transaction-synchronized Session for current threadSpring Boot 2.5 Hibernate 错误:无法获取当前线程的事务同步会话
【发布时间】:2021-08-10 22:09:00
【问题描述】:

当最近的 Spring Boot 2.5 发布时,我的项目无法调用任何服务方法并出现错误: 无法获取当前线程的事务同步会话 它适用于 2.4.x。

SystemConfig.java:

@Bean
public LocalSessionFactoryBean sessionFactory() throws PropertyVetoException {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource());
    sessionFactoryBean.setPackagesToScan("qi.ruibu.model");
    Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty("hibernate.dialect", 
    "org.hibernate.dialect.PostgreSQL10Dialect");
    hibernateProperties.setProperty("hibernate.show_sql", "false");
    hibernateProperties.setProperty("hibernate.autoReconnect", "true");
    hibernateProperties.setProperty("hibernate.query.substitutions", "true 1, false 0");
    sessionFactoryBean.setHibernateProperties(hibernateProperties);
    return sessionFactoryBean;
}

@Bean
public HibernateTransactionManager txManager() throws PropertyVetoException {
    HibernateTransactionManager txManager = new HibernateTransactionManager();
    txManager.setSessionFactory(sessionFactory().getObject());
    return txManager;
}

BaseDaoImpl.java

private SessionFactory sessionFactory;

@Override
public SessionFactory getSessionFactory() {
    return sessionFactory;
}

@Override
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

private Session getCurrentSession() {
    if (sessionFactory.getCurrentSession() == null) {
        sessionFactory.openSession();
    }
    return sessionFactory.getCurrentSession();
}

xxxServiceImpl.java

Query query = baseDao.getSessionFactory().getCurrentSession().createQuery(hql); // error

【问题讨论】:

    标签: spring-boot hibernate


    【解决方案1】:

    经过一天的尝试和搜索,我终于找到了原因: 包命名空间错误

    Spring Boot 2.5 开始

    @Transactional 应该使用 导入 org.springframework.transaction.annotation.Transactional;

    而不是 导入 javax.transaction.Transactional;

    现在一切正常。

    【讨论】:

      【解决方案2】:

      请添加@Repository @Transactional

      【讨论】:

      • 我已经在 BaseDaoImpl 中添加了 Repository,在 xxxService 中添加了 Transactional
      猜你喜欢
      • 1970-01-01
      • 2015-09-22
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 2017-01-01
      • 2015-04-04
      • 1970-01-01
      相关资源
      最近更新 更多