注釈ベースの構成クラスで構成された 2 つのトランザクション マネージャーがあります。
@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());
}
}
私の意図は、2 つのトランザクション マネージャーで注釈トランザクションを使用することです。このように注釈が付けられたメソッド
@Transactional
public void method() {}
defTransactionManager で処理する必要があります
そして、このように注釈が付けられたメソッド
@Transactional("secondTM")
public void anotherMethod() {}
によって secondTransactionManager
defTransactionManager は正常に動作しますが、 anotherMethod() に関しては次のようになります。
org.hibernate.HibernateException: No Session found for current thread
anotherMethod にプログラムによるトランザクション管理を使用すると (autowire secondSessionFactory、TransactionTemplate を使用)、すべて正常に動作します。