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

发布于 2024-11-07 23:00:02 字数 1178 浏览 6 评论 0 原文

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

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

所以我们认为我们可以通过使用 自定义注释。我们在抽象基类中定义所有方法,并为每个事务管理器创建一个空的实现类。

现在的问题是:

AbstractFallbackTransactionAttributeSource,这是正在完成的查找:

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

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

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

[我还在 Spring 社区论坛中提出了这个问题]

Project setup: Spring 3.0.5 / JPA 2 / Hibernate / @Transactional

We work with several different Data Sources (and hence different transaction managers), but have common Service base classes, as a lot of the functionality is reused.

So we thought we'd solve this by using Custom Annotations. We define all methods in an abstract base class, and create one empty implementation class per Transaction Manager.

Now the problem is:

In AbstractFallbackTransactionAttributeSource, this is the lookup that is being done:

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

First the method is checked, then the class that declares the method (and its ancestors). But in our context, the custom annotation resides in a subclass that can't be found by going upwards.

So how can we solve this problem?

[I also asked this question in the Spring Community Forum]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你的背包 2024-11-14 23:00:02

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

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

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

Great catch. I don't know a good solution but as a workaround, you can override the methods in question in the implementation like so:

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

that will make the @Transactional visible but it's ugly :-/

明明#如月 2024-11-14 23:00:02

目前,我们通过提供

  1. 我们自己的子类 来解决这个问题
    AnnotationTransactionAttributeSource
    对目标进行查找
    首先类,然后委托给
    超类
  2. A BeanFactoryPostProcessor 它将我们的实现替换为内部创建的原始 AnnotationTransactionAttributeSource bean 定义

For the time being, we solved this issue by providing

  1. our own subclass of
    AnnotationTransactionAttributeSource
    which does a lookup on the target
    class first and then delegates to
    the super class
  2. A BeanFactoryPostProcessor that substitues our implementation for the original AnnotationTransactionAttributeSource bean definition that is created internally by <tx:annotation-driven>

.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文