5

注釈ベースの構成クラスで構成された 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 を使用)、すべて正常に動作します。

4

2 に答える 2

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を定義する場合は、クラスからアノテーションを削除し、アノテーションでtxManagerを指定する必要があります。@EnableTransactionManagement@Configuration@Transactional

@Service
@Transactional(value="myTxManager", readOnly = true)
public class MyServiceImpl implements MyService { ... }
于 2014-09-17T08:01:03.900 に答える
1

@EnableTranscationManagementの場合、Spring はタイプ別ルックアップを使用します。独自のルックアップ メソッドを単一のトランザクション マネージャーに提供できますが、2 つの tx マネージャーでは機能しません。

Spring が実行するトランザクションを決定する方法を確認したい場合は、TransactionAspectSupportクラスのデバッグを試みることができます。主な方法はsetTransactionManagerBeanNamedetermineTransactionManagerです。

于 2012-08-06T13:04:04.887 に答える