在最近的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
请添加@Repository@Transactional
经过一天的尝试和搜索,我终于找到了原因:包命名空间是错误的
春季启动2.5
@Transactional应使用导入org.springframework.transaction.annation.Transactional;
而不是import javax.transaction.Transactional;
现在一切都很好。