web-dev-qa-db-ja.com

「@Transactional」はサービスレイヤーまたはDAOを配置する場所

第一に、以前に質問され回答されたものを求めているが、検索結果を取得できなかった可能性があります。大丈夫一般的に(または常にこれまで:))私たちはサービス層にトランザクションの注釈を定義します

Controller-> Manager-> Dao-> Orm。

クライアントサイトに基づいたドメインモデルを選択する必要がある状況になりました。クライアントAが私のドメインモデルを使用しているとしたら、すべては問題ありませんが、他のクライアントサイトはWebサービスを提供し、ドメインモデルは使用していません。

どのレイヤーを交換する必要があります。私は、Webサービスからデータを取得し、それを送り返すDaoである必要があると考えています。

@TransactionalをServiceレイヤーに入れると、密結合を行っていることがわかりました(そのようなことがある場合や疎結合がない場合)。多くの脳が間違っていることはありませんか、そうではありません(私はそれを疑います)。

そこで質問は、「「@ Transactional」はどこにService LayerまたはDAOを配置すべきですか?」です。そして、それは私が交換しなければならない下向きのサービス層ですか?.

75
Shahzeb

理想的には、サービスレイヤー(マネージャー)はビジネスロジックを表すため、@ Transactionalアノテーションを付ける必要があります。

サービスレイヤーは、異なるDAOを呼び出してDB操作を実行できます。サービスメソッドに3つのDAO操作がある状況を想定してみましょう。最初のDAO操作が失敗した場合、他の2つがまだ渡される可能性があり、一貫性のないDB状態になります。サービス層に注釈を付けると、このような状況からあなたを救うことができます。

68
Badal

サービスをトランザクション対応にしたいと思うでしょう。 DAOがトランザクション対応であり、各サービスで異なるDAOを呼び出す場合、複数のtxが必要になりますが、これは望ましくありません。サービスをトランザクションコールにすると、それらのメソッド内のすべてのDAOコールはメソッドのtxに参加します。

58
hvgotcodes

複数のDAOを実装できるため、@ Transactionalをサービスレイヤーメソッドに配置することをお勧めします。これを使用することで、サービスをトランザクション化できます。 参照

ベストプラクティスは、一般的なBasicServiceを使用して共通のサービスを提供することです。

サービスは@Transactionalを配置するのに最適な場所です。サービスレイヤーは、論理的にトランザクションに移行するユーザーインタラクションの詳細レベルのユースケースの動作を保持する必要があります。このようにして、Webアプリケーションコードとビジネスロジックの分離を維持できます。

重要なビジネスロジックを持たない多くのCRUDアプリケーションがあります。コントローラとデータアクセスオブジェクトの間を通過するだけのサービスレイヤーを持っているため、それらは役に立ちません。これらの場合、Daoにトランザクションアノテーションを付けることができます。

したがって、実際には、どちらの場所にでも置くことができます、それはあなた次第です。

サービスで複数の呼び出しを行うには、@ Transactional in serviceが必要です。 @Transactionalをin serviceにすると、さまざまなサービス呼び出しがさまざまなトランザクションで実行されます。

6
kapil das

別のモデルで同じデータを提供する必要があるクライアントBのドメインモデルを変更する場合は、サービスレイヤーで@Transactionalを使用する必要があります。別のサービスを提供するか、DAOレイヤーに影響を与えずにドメインモデルを変更できます。インターフェイスを作成し、異なるモデルで同じサービスを使用してインターフェイスを実装することにより、クライアントに基づいてモデルにデータを入力します。この決定は、ビジネス要件とプロジェクトの範囲に基づいています。

0
Sonia Jain

アプリケーションが多くのモジュールにまたがり、操作の大半が@CRUDベースである場合、アプリケーションレベルに基づいて個人的に選択します。サービスレベルで@transactionalアノテーションを使用すると、より意味があります。スケジューラ、ジョブサーバー、@ etlなどのエンジンタイプアプリケーションセッションとユーザーコンセプトが存在しないアプリを報告する場合、コンテキストレベルでの伝播トランザクションが最適です... @transactionalを配置することでクラスター化されたトランザクションを作成しないでください。 JTA2を制御するのが最も適切な答えです...これは、特定の状況で使用できる天気に依存します...

0
David Hamas