我正面临着一个问题,我真的不知道如何抓住猫尾巴(如果你让我开玩笑的话:o))
我有一个战争中的webapp,在tomcat中部署。战争包含4个罐子。 4个罐子有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 - 由于没有正在进行的事务而延迟身份插入
但是,如果我单独启动jar 1(例如),一切都运行良好。
非常感谢你的启发。
答案 0 :(得分:2)
让我猜一下:
在你的servlet-context.xml中,你导入了上下文吗? e.g:<import location="classpath:context1.xml" />
<import location="classpath:context2.xml" />
等
如果这样做,所有bean定义都会从导入的上下文复制到根上下文中,这意味着您有四个不同的<tx:annotation-driven />
声明,具有不同的事务管理器。可能是最后一个获胜。
可能的解决方案:use Qualifiers或use the XML style of transaction declaration。
我要做的可能是为每个上下文引入自定义@Transactional
注释:
@Transactional("tx1")
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Transactional1 {}
现在使用@Transactional1
在jar 1中注释jar {1}}中的所有方法,并在10.5.6.3 Custom shortcut annotations