32

@Configurationxml ファイルの代わりに、Spring の構成に注釈を使用しています。異なるセッション ファクトリと異なるトランザクション マネージャーを使用して 2 つのデータソースを構成しています。ここで@EnableTransactionManagement注釈の問題に悩まされています。私はそのドキュメントを読んで、

@EnableTransactionManagementより柔軟です。PlatformTransactionManagerコンテナー内の任意の Beanのタイプ別ルックアップにフォールバックします。したがって、名前は「txManager」、「transactionManager」、または「tm」にすることができます。単に問題ではありません。

PlatformTransactionManagerこれは、メソッドに付けた名前が何であれ、 2 つのトランザクション マネージャーがある間は常にオブジェクトを返すメソッドを検索することを意味します。問題は、このクラスをテストすると、エラーが発生することです。

org.springframework.beans.factory.NoSuchBeanDefinitionException: タイプ [ org.springframework.transaction.PlatformTransactionManager] の一意の Bean が定義されていません: 単一の Bean が必要ですが、2 が見つかりました

2 つの異なる構成クラスを作成しようとしましたが、無駄でした。xml 構成では、これは当てはまりませんでした。両方のトランザクション マネージャーを 2 つの<tx:annotation-driven transaction-manager="" />タグで登録したところ、問題なく動作しました。ただし、ここでは注釈を使用して同じことを行うことはできません。

Spring アノテーション付き構成クラスで 2 つの異なるトランザクション マネージャーを使用して 2 つのデータソースを構成したい場合はどうすればよいですか?

4

7 に答える 7

37

構成クラスで、@EnableTransactionManagement注釈を使用します。

このクラスのトランザクション マネージャーを次のように定義します。

    @Bean(name="txName")
    public HibernateTransactionManager txName() throws IOException{
        HibernateTransactionManager txName= new HibernateTransactionManager();
        txName.setSessionFactory(...);
        txName.setDataSource(...);
        return txName;
   }

次に、トランザクション ジョブを実行するクラス/メソッドで、次のように注釈を付けます。

@Transactional("txName")

また

@Transactional(value = "txName")

これは、名前修飾されたトランザクション マネージャーを必要な場所に結び付ける方法です。必要な数のトランザクション マネージャーを使用できるようになり、必要に応じて使用できるようになりました。

于 2013-12-27T19:46:16.090 に答える
5

Javaドキュメントから


@EnableTransactionManagement使用する正確なトランザクション マネージャー Bean との 間のより直接的な関係を確立したい場合は、TransactionManagementConfigurerコールバック インターフェイスを実装できます。実装句と@Override以下の注釈付きメソッドに注意してください。

クラスはインターフェイス@Configurationを実装する必要があります-使用する必要がある への参照を返す を実装します。TransactionManagementConfigurerannotationDrivenTransactionManagertransactionManager

于 2011-11-08T17:09:52.330 に答える
1

2 つの TransactionManagers を使用している理由がわかりません。AbstractRoutingDataSource を介して複数のデータソースに同じ TransactionManager を使用することを検討できます。ご参照ください

http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/

使用例をご覧ください。

于 2011-12-07T07:50:21.997 に答える
0

他の回答のいくつかは、2 つのトランザクション マネージャーを使用することが何らかの点で間違っていることを暗示しています。ただし、Spring の XML 構成では、オンライン ドキュメント (下記) に記載されているように、複数のトランザクション マネージャーを使用できます。@EnableTransactionManagement残念ながら、同様の方法で注釈を機能させる方法はないようです。その結果、注釈を使用して、行@ImportResourceを含む XML ファイルをロードするだけです。<tx:annotation-driven/>これにより、ほとんどの場合に Java 構成を取得できますが@Transactional、オプションの Transaction Manager 修飾子を使用することもできます。

http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/transaction.html

ほとんどの Spring アプリケーションは単一のトランザクション マネージャーのみを必要としますが、単一のアプリケーションで複数の独立したトランザクション マネージャーが必要になる場合があります。アノテーションの value 属性を@Transactional使用して、使用する の ID をオプションで指定できますPlatformTransactionManager。これは、トランザクション マネージャー Bean の Bean 名または修飾子の値のいずれかです。たとえば、修飾子表記を使用すると、次の Java コード

于 2013-09-26T02:20:15.480 に答える