2

私は問題に直面しています私は猫のしっぽを捕まえる方法を本当に知りません(あなたが私に冗談をくり抜いたら:o))

私は戦争中のWebアプリを持っており、Tomcatにデプロイします。戦争には4つの瓶が含まれています。4つのjarには、4つのapplicationContext、4つのentityManager、および4つのTransactionManagerがあります。

このように宣言します(番号1 ..を変更します):

      <bean id="entityManagerFactory1" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    p:dataSource-ref="dataSource1"
    p:persistence-unit-name="com.xxxxxx.domain"     >

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
        p:databasePlatform="${ds1.dbdialect}" p:generate-ddl="false"
            p:showSql="${ds1.showsql}"  />
    </property>
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>

  <bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory1">
    depends-on="entityManagerFactory1" name="transactionManager1"/>


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

コンテキストは次のようにロードされます:

私の問題は、BOが3の場合、トランザクションがデータソース2で開いていることを発見しました。

さらに、永続化を行うと、次のメッセージが表示されます。

AbstractSaveEventListener-進行中のトランザクションがないため、ID挿入を遅らせます

しかし、jar 1を単独で起動すると(たとえば)、すべてが完全に機能しています。

啓蒙に感謝します。

4

1 に答える 1

2

私に当てさせてください:

servlet-context.xmlで、コンテキストをインポートしますか?例えば:

<import location="classpath:context1.xml" />
<import location="classpath:context2.xml" />

そうした場合、すべてのBean定義がインポートされたコンテキストからルートコンテキストにコピーされます。つまり、<tx:annotation-driven />異なるトランザクションマネージャーを持つ4つの異なる宣言があります。おそらく最後のものが勝ちます。

考えられる解決策:修飾子を使用するか、XMLスタイルのトランザクション宣言を使用します

私がやろうとしていることは、おそらく@Transactionalコンテキストごとにカスタムアノテーションを導入することです。

@Transactional("tx1")
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Transactional1 {}

@Transactional1ここで、jar 1のすべてのメソッドに、、 jar 2のすべてのメソッドに注釈を付けます@Transactional2。このメカニズムは、セクション10.5.6.3のカスタムショートカット注釈に記載されています。

于 2011-05-17T11:14:04.380 に答える