Spring声明式事务管理:多个切入点

时间:2011-07-15 21:59:55

标签: java hibernate spring transactions aop

我知道它几乎是周末但仍值得尝试:)

我需要使用多个事务管理器,因此我可以使用声明式事务管理而不是使用tx:annotation-driven。但是,我在各种包中都有服务类,以下配置不起作用:

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="dataSource" ref="ds" />
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="svcPointcut1" expression="execution(* com.app.services.*.*(..))"/>
    <aop:pointcut id="svcPointcut2" expression="execution(* com.app.campaigns.services..*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="svcPointcut1" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="svcPointcut2" />
</aop:config>

有人可以告诉我为什么只有第一个切入点有效而第二个切入点有效吗? com.app.services包中的服务方法在事务的上下文中执行,但com.app.campaigns.services(及其下面的子包)中的服务方法抛出UnsupportedException。 请让我摆脱这种痛苦!万分感谢!

PS:该应用程序使用Spring 2.5.6

1 个答案:

答案 0 :(得分:0)

  

我需要使用多个事务管理器   我觉得用陈述性交易管理代替   使用tx:annotation-driven。

这两个都有资格作为“声明性”交易管理。但更重要的是,您仍然可以使用多个tx管理器的注释驱动事务。只需将经理的姓名或限定符作为"value" attribute of the annotation。使用此XML:

<bean id="project1TransactionManager" class="...TransactionManager">
    <qualifier value="project1"/>
</bean>
<bean id="project2TransactionManager" class="...TransactionManager">
    <qualifier value="project2"/>
</bean>

以下任何一项都应该有效:

@Transactional("project1")
@Transactional("project1TransactionManager")
@Transactional("project2")
@Transactional("project2TransactionManager")