我在基于注释的配置类中配置了两个事务管理器:
@Configuration
@EnableTransactionManagement
public class DBConfig implements TransactionManagementConfigurer {
//...
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return defTransactionManager();
}
@Bean
@Qualifier("defSessionFactory")
public LocalSessionFactoryBean defSessionFactory() {
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean();
sfb.setDataSource(defDataSource());
Properties props = new Properties();
//...
sfb.setHibernateProperties(props);
sfb.setPackagesToScan("my.package");
return sfb;
}
@Bean
@Qualifier("defTransactionManager")
public PlatformTransactionManager defTransactionManager() {
return new HibernateTransactionManager(defSessionFactory().getObject());
}
@Bean
@Qualifier("secondSessionFactory")
public LocalSessionFactoryBean secondSessionFactory() {
LocalSessionFactoryBean sfb = new LocalSessionFactoryBean();
sfb.setDataSource(secondDataSource());
Properties props = new Properties();
//...
sfb.setHibernateProperties(props);
sfb.setPackagesToScan("my.package.subpackage");
return sfb;
}
@Bean
@Qualifier("secondTM")
public PlatformTransactionManager secondTransactionManager() {
return new HibernateTransactionManager(secondSessionFactory().getObject());
}
}
我的意图是使用两个事务管理器的注释事务。 Methonds注释如下
@Transactional
public void method() {}
应由defTransactionManager
处理和这样注释的方法
@Transactional("secondTM")
public void anotherMethod() {}
by secondTransactionManager
defTransactionManager工作正常但是当涉及到anotherMethod()时,我得到:
org.hibernate.HibernateException: No Session found for current thread
当我对anotherMethod使用程序化事务管理(autowire secondSessionFactory,使用TransactionTemplate)时,一切正常。
答案 0 :(得分:1)
如果@EnableTranscationManagement Spring将使用按类型查找,您可以为单个事务管理器提供自己的查找方法,但it will not work for two tx managers
如果要检查Spring如何确定要执行的事务,可以尝试调试TransactionAspectSupport类。关键方法是setTransactionManagerBeanName
和determineTransactionManager
。
答案 1 :(得分:1)
万一有人遇到这个问题,我找到了一个解决方案:
@Configuration
@EnableTransactionManagement
@DependsOn("myTxManager")
@ImportResource("classpath:applicationContext.xml")
public class AppConfig implements TransactionManagementConfigurer {
@Autowired
private PlatformTransactionManager myTxManager;
...
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return this.myTxManager;
}
通过这种方式,您可以使用xml配置中定义的特定txManager。
如果您想要定义服务级别使用的 txManager ,您应从<{1}}类删除 @EnableTransactionManagement
注释在@Configuration
注释中指定 txManager ,例如
@Transactional