在配置两个事务管理器时,哪个将在@Transactions上使用而不显式指定事务管理器?

时间:2017-10-26 06:00:00

标签: java spring hibernate transactions spring-transactions

我配置了两个交易管理器

XML Config中的一个

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

<aop:config>
    <aop:advisor pointcut="execution(* com.myorg.*Service.*(..))" advice-ref="transactionAdvice"/>
</aop:config>

<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
</tx:advice>

Java配置中的其他内容

@Bean("transactionManager")
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

但是当我使用@Transactional注释时,在我看来,即使在点切割不匹配时,也会使用XML中定义的事务管理器。

我希望在执行时匹配在AOP中定义的切入点事务管理器 以及在Java配置中定义的@Transactional注释事务管理器。

出于某种原因,我无法在@Transactional注释中明确指定事务管理器名称,如@Transactional(“transactionManager”)。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

在spring boot中(我猜它也应该适用于spring)我执行以下操作让spring知道与@Transactional注释一起使用的默认事务管理器是什么:

@Configuration
public class CustomTransactionManagementConfiguration implements TransactionManagementConfigurer, ApplicationContextAware {

    private ApplicationContext applicationContext;

    /**
     * @return default transaction manager for rogue {@link Transactional} annotations
     */
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return applicationContext.getBean("myTransactionManagerQualifier", PlatformTransactionManager.class);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}