0

When recent Spring Boot 2.5 release, my project can't call any service method with error: Could not obtain transaction-synchronized Session for current thread It works fine with 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
mymbrooks
  • 43
  • 5

2 Answers2

0

Please add @Repository @Transactional

Zaur
  • 206
  • 2
  • 4
0

After one day try and search, I finally find the reason: the package namespace is wrong

beginning of Spring Boot 2.5

@Transactional should use import org.springframework.transaction.annotation.Transactional;

instead of import javax.transaction.Transactional;

now everything works fine.

mymbrooks
  • 43
  • 5