36

2 つのデータベース (MySql と HSQLDB) があります。2 つのデータ ソースと 2 つの EntityManagerFactory Bean を構成しました。対応する 2 つの JpaTransactionManager Bean を構成することもできます。

しかし、具体的なサービスクラスのトランザクションを管理するためにそれらのどれを使用する必要があるかを指定する方法がわかりません。その目的で注釈を使用したいのです@Transactionalが、実際には txManagers の 1 つしか指定できません。

<tx:annotation-driven transaction-manager="manager"/>

この状況から抜け出す方法は何ですか?

4

4 に答える 4

19

トランザクションマネージャー<tx:annotation-driven>なしの属性を宣言し、次のようにトランザクションマネージャーの修飾子を宣言します。

<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <qualifier value="txManager1"/>
</bean>

@Transactionalのこの修飾子をとして使用して、トランザクションマネージャーの1つを選択します。

@Transactional("txManager1")

または、より多くのプロパティを使用:

@Transactional(value = "txManager1", readOnly = true)   
于 2009-12-25T18:45:51.620 に答える
18

JpaTransactionManagerのjavadoc には、これに関するアドバイスがあります。

このトランザクション マネージャーは、単一の JPA EntityManagerFactory をトランザクション データ アクセスに使用するアプリケーションに適しています。JTA (通常は JtaTransactionManager 経由) は、同じトランザクション内の複数のトランザクション リソースにアクセスするために必要です。JPA プロバイダーを JTA トランザクションに参加させるには、それに応じて JPA プロバイダーを構成する必要があることに注意してください。

つまり、対応する tx マネージャーを使用して複数のエンティティ マネージャーを使用している場合は、JtaTransactionManager代わりに単一のマネージャーを使用することを検討する必要があります。エンティティ マネージャーは JTA トランザクションに参加できる必要があります。これにより、一度にどちらのエンティティ マネージャーにいるかを気にすることなく、両方のエンティティ マネージャー間で完全なトランザクション性が得られます。

もちろん、JtaTransactionManagerTomcat のような通常のサーブレット エンジンではなく、JTA を完全にサポートするアプリケーション サーバーが必要です。

于 2009-12-25T20:14:37.533 に答える
13

久々の正解なので。

複数のデータベースに対する JpaTransactionManager の使いやすさという点では、Skaffman が正しいかもしれません。

しかし、2 つの異なる JpaTransactionManager で 2 つの異なるデータベースを使用するための実用的なソリューションがあります。

  @Bean(name = "db2TransactionManager")
  public PlatformTransactionManager transactionManager2() throws NamingException {
    JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
    return txManager;
  }

  @Bean
  @Primary
  public PlatformTransactionManager transactionManager() throws Exception {
     JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactory());
    txManager.setNestedTransactionAllowed(true);
    return txManager;
  }

@Primaryで修飾子名を指定しないものを指定するために使用する必要があります@Transactional

于 2013-09-21T00:32:10.530 に答える
6

以下のように、application-context.xml で 2 つのトランザクション マネージャーを指定する必要があります。

<tx:annotation-driven transaction-manager="manager1"/>
<tx:annotation-driven transaction-manager="manager2"/>

@Transactional 属性は、関連するトランザクション マネージャーを使用するようになりました。

于 2011-10-21T05:52:05.653 に答える