4

久しぶりのリスナー初発信者。

一般的なトランザクション ロジックを含む AbstractService.java クラスがあります。このクラスのすべてのメソッドがトランザクションに対応しているわけではありません。かつては、Spring の @Transactional アノテーションが付けられています。

現在、AbstractService の各実装は、異なるトランザクション マネージャーを持つ可能性があります。これは、抽象クラスのメソッドをオーバーライドすることで具象クラスで構成でき、別の tx マネージャーを提供します。

@Transactional(値=TRANSACTION_MANAGER)

「アノテーション属性 Transactional.value の値は定数式でなければならない」ため、抽象クラスにトランザクション マネージャ名を渡すことはできません。

私の知る限り、トランザクションマネージャーを構成するには2つの方法があります。

  1. スーパーメソッドを呼び出すためだけに、具象クラスのすべての @Transactional メソッドをオーバーライドします。

     @Transactional(timeout = 60, value = TRANSACTION_MANAGER)
     @Override
     public String editEntity(Integer id, Integer columnPosition, Object value) {
    return super.editEntity(id, columnPosition, value);
    
  2. 代わりに、クラス レベルで @Transactional アノテーションを追加してください。これにより、非トランザクション メソッドがトランザクション内で処理されるようになり、非トランザクション メソッドが他のトランザクション メソッドを呼び出すと、ネストされた tx スープができあがります。

3番目のオプションはありますか? 現在非推奨のスプリング テスト@NotTransactionalのようなものは、上記のオプション 2 と一緒にトリックを実行します。

ほぼ 3 年前に非常によく似た質問がありました。それ以来、Spring で多くのことが起こったので、別の選択肢はありますか?

それはきちんとしていますが、カスタム注釈の回答は質問に対処していません。

私の質問は次のように要約できます。

トランザクションマネージャーを指定するためだけにすべてのトランザクションメソッドをオーバーライドすることなく、トランザクションを構成するにはどうすればよいですか?

4

1 に答える 1

2

AbstractServiceを3 つのクラスにリファクタリングすることをお勧めします。

  • 最初のクラスは、現在のAbstractService、そのインターフェイス、メソッド シグネチャなどであり、既存の子クラスとのバイナリ互換性を維持しますが、すべての実装は削除されています。
  • 2 番目のクラスには、トランザクションのすべてのビジネス ロジックが含まれている@Transactionalため、(クラス レベルで正しいトランザクション マネージャーを使用して) アノテーションを使用します。
  • 3 番目のクラスには、すべての非トランザクション ビジネス ロジックが含まれます。

ここで、最後の 2 つのクラスをリファクタリングされた にオートワイヤするだけです。これによりAbstractService、着信メソッド呼び出しが、新しく作成されたクラスの 1 つに移動された実装に委譲されます。

于 2013-02-07T21:04:08.867 に答える