5

プロジェクトのセットアップ:Spring 3.0.5 / JPA 2 / Hibernate / @Transactional

いくつかの異なるデータソース(したがって異なるトランザクションマネージャー)を使用しますが、多くの機能が再利用されるため、共通のサービス基本クラスがあります。

そのため、カスタムアノテーションを使用してこれを解決すると考えました。すべてのメソッドを抽象基本クラスで定義し、TransactionManagerごとに1つの空の実装クラスを作成します。

今問題は次のとおりです。

AbstractFallbackTransactionAttributeSource、これは実行されているルックアップです。

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

最初にメソッドがチェックされ、次にメソッドを宣言するクラス(およびその祖先)がチェックされます。しかし、私たちのコンテキストでは、カスタムアノテーションは、上に移動しても見つからないサブクラスに存在します。

では、どうすればこの問題を解決できますか?

[春のコミュニティフォーラムでもこの質問をしました]

4

2 に答える 2

4

素晴らしいキャッチ。良い解決策はわかりませんが、回避策として、次のように実装で問題のメソッドをオーバーライドできます。

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

それは目に@Transactional見えるようになりますが、それは醜いです:-/

于 2011-05-17T14:30:24.717 に答える
1

当面は、以下を提供することでこの問題を解決しました

  1. 私たち自身のサブクラスは AnnotationTransactionAttributeSource 、最初にターゲットクラスを検索し、次にスーパークラスに委任します
  2. によって内部的に作成された元のBean定義BeanFactoryPostProcessorの実装を置き換えるAAnnotationTransactionAttributeSource<tx:annotation-driven>

于 2011-05-17T15:54:29.317 に答える