【问题标题】:Class Hierarchy problem using @Transactional使用@Transactional 的类层次结构问题
【发布时间】:2011-05-17 14:25:55
【问题描述】:

项目设置: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]

【问题讨论】:

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


    【解决方案1】:

    很棒的收获。我不知道一个好的解决方案,但作为一种解决方法,您可以像这样覆盖实现中的相关方法:

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

    这将使@Transactional 可见,但它很难看:-/

    【讨论】:

    • 我已经想到了这一点。这很丑陋,但作为最后的手段,它也是一个明显的解决方案。也许如果各个子类是自动生成的,我会想到这一点。 +1 对你有意义:-),但显然这不是我要找的
    【解决方案2】:

    暂时,我们通过提供解决了这个问题

    1. 我们自己的子类 AnnotationTransactionAttributeSource 它对目标进行查找 先上课,然后委托给 超类
    2. BeanFactoryPostProcessor 用我们的实现替换了由 <tx:annotation-driven> 在内部创建的原始 AnnotationTransactionAttributeSource bean 定义

    .

    【讨论】:

      猜你喜欢
      • 2011-01-18
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      相关资源
      最近更新 更多