使用@Transactional的类层次结构问题

时间:2011-05-17 14:25:56

标签: java spring spring-aop spring-transactions spring-orm

项目设置:Spring 3.0.5 / JPA 2 / Hibernate / @Transactional

我们使用多个不同的数据源(因此使用不同的事务管理器),但是具有公共服务基类,因为许多功能都被重用。

所以我们认为我们可以使用Custom Annotations来解决这个问题。我们在抽象基类中定义所有方法,并为每个事务管理器创建一个空实现类。

现在的问题是:

AbstractFallbackTransactionAttributeSource中,这是正在进行的查找:

TransactionAttribute txAtt = findTransactionAttribute(specificMethod);
// ...
// Second try is the transaction attribute on the target class.
txAtt = findTransactionAttribute(specificMethod.getDeclaringClass());

首先检查方法,然后检查声明方法的类(及其祖先)。但在我们的上下文中,自定义注释驻留在一个子类中,该子类无法通过向上移动找到。

那么我们如何解决这个问题?

[我也问过这个问题in the Spring Community Forum]

2 个答案:

答案 0 :(得分:3)

很棒。我不知道一个好的解决方案,但作为一种解决方法,您可以在实现中覆盖相关方法,如下所示:

@Override
void method(...)
    // Just to work around a bug in AbstractFallbackTransactionAttributeSource
    super.method(...);
}

会使@Transactional可见,但很难看: - /

答案 1 :(得分:0)

目前,我们通过提供

解决了这个问题
  1. 我们自己的子类 AnnotationTransactionAttributeSource 它在目标上进行查找 先上课然后再委托 超级
  2. 一个BeanFactoryPostProcessor,用于替换AnnotationTransactionAttributeSource
  3. 内部创建的原始<tx:annotation-driven> bean定义的实现