2

状況

ファサード パターンを使用すると、異なる単一のサービスが 1 つの束にまとめられるため、ユーザーがさまざまなサービス オブジェクト (POJO またはセッション Bean) と直接対話しない可能性が高くなります。

アノテーションは、Facadeの@Transactionalメソッドではなく、単一サービスのメソッドのレベルで適用されます。

これは実際的な問題を解決します。サービスにインターフェースがない場合、Spring は適切なトランザクション プロキシを使用できず、さまざまな複雑さを引き起こします。

質問

望ましい実践とは何ですか?

  • 優れたプロキシのために単一のサービス インターフェイスを作成する
  • または、@Transactionalアノテーションを Facade メソッドに移動します (これにより、内部的にサービスを使用する場合も、トランザクションを保証するために Facade を通過する必要があります)。
  • それとも?

現場経験は?また、広い視野からの検討も歓迎します。

4

2 に答える 2

3

サービスにインターフェースがない場合でも、SpringはCGLIBプロキシを使用してトランザクションの側面を適用できます。ほとんどの場合、正常に機能します。サービスにいくつかのインターフェースがある場合、実際の問題が発生しますが、トランザクションメソッドはこれらのインターフェースの一部ではありません。

ただし、@TransactionalFacadeインターフェースは明確なトランザクション境界を定義するため、Facadeメソッドに適用する方がよりクリーンなソリューションになる可能性があります。この場合、Facadeなしでサービスを使用することに不安がある場合は、@TransactionalFacadeメソッドだけでなくサービスにも適用できます。これらの場合、Facadeメソッドを呼び出すときに作成されたトランザクションは、サービスメソッドに伝播されます。

于 2011-03-31T17:27:06.900 に答える
1

トランザクション境界を設定するための唯一の基準は、技術的な問題ではなく、ビジネス ロジックの基準であるべきです。サービス メソッドがアトミック操作である必要がある場合は、そこでトランザクションを管理します。ファサードが 2 つ以上のサービス呼び出しを組み合わせることができ、それらをまとめて「すべてを実行するか、何も実行しない」必要がある場合、これはトランザクションをファサードに配置する必要があることを意味します。axtavt が述べたように、cglib プロキシを使用して、インターフェイスのないクラスをプロキシできます。

Mark Richards によるこのシリーズもお勧めします: http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=transaction+strategies :

于 2011-04-04T09:31:16.250 に答える