2

我遇到了一个问题,我真的不知道如何抓住猫尾巴(如果你把我开玩笑:o))

我有一个 webapp 在战争中,部署在 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" />

上下文是这样加载的:

我的问题是,我发现当我使用 3 的 BO 时,事务以 2 的数据源打开。

此外,如果我坚持下去,我会收到以下信息:

AbstractSaveEventListener - 由于没有正在进行的交易而延迟身份插入

但是,如果我单独启动 jar 1(例如),一切正常。

非常感谢您的启发。

4

1 回答 1

2

让我猜猜:

在您的 servlet-context.xml 中,您是否导入了上下文?例如:

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

等等

如果这样做,所有 bean 定义都会从导入的上下文复制到根上下文中,这意味着您有四个不同的<tx:annotation-driven />声明,具有不同的事务管理器。应该是最后一个赢了。

可能的解决方案:使用限定符使用 XML 样式的事务声明

我要做的可能是为@Transactional每个上下文引入一个自定义注释:

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

现在用 注释 jar 1 中的所有方法@Transactional1,在 jar 2 中用@Transactional2etc 注释。此机制记录在第10.5.6.3 节自定义快捷方式注释中

于 2011-05-17T11:14:04.380 回答