项目设置: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]
答案 0 :(得分:3)
很棒。我不知道一个好的解决方案,但作为一种解决方法,您可以在实现中覆盖相关方法,如下所示:
@Override
void method(...)
// Just to work around a bug in AbstractFallbackTransactionAttributeSource
super.method(...);
}
会使@Transactional
可见,但很难看: - /
答案 1 :(得分:0)
目前,我们通过提供
解决了这个问题AnnotationTransactionAttributeSource
它在目标上进行查找
先上课然后再委托
超级BeanFactoryPostProcessor
,用于替换AnnotationTransactionAttributeSource
<tx:annotation-driven>
bean定义的实现
醇>