1. ホーム
  2. spring

[解決済み] Transactionalはどこに置くべきか Service Layer or DAO

2023-05-05 22:45:37

質問

まず、私が質問していることが、以前に質問され回答されている可能性がありますが、私は検索結果を得ることができませんでした。私たちはサービス層にトランザクションアノテーションを定義しています典型的な春のHibernateのくずは、通常

コントローラ->マネージャ->ダオ->オーム.

私は今、クライアントサイトに基づいてドメインモデルを選択する必要がある状況にあります。 例えば、クライアントAが私のドメインモデルを使用している場合は良いのですが、他のクライアントサイトは私にウェブサービスを提供し、私たちのドメインモデルを使用しないとします。

どのレイヤーを置き換えるべきでしょうか。つまり、2つの別々に書かれたDAOレイヤーを、シナリオに基づいてプラグインするのです。

私は今、私たちがタイトなカップリング(そのようなものがある場合、またはルーズなカップリングを持っていないと言う)を行っていることに気づきました。 @Transactional を入れたとき、密結合をしていたことに気づきました。これだけの頭脳があるのだから、間違ってはいないのだろう。

だから質問は、"どこで&quotをする必要があります。 @Transactional は、サービス層かDAOか?


11年経ってもまだ関連性があります。プロジェクトを振り返ってみると、当時のドメイン モデルに対する私の理解は明らかに間違っていました。私は ORM レイヤーをドメイン モデルとみなしており、ORM と分離されたエンティティで動作し、データ マッピングも DTO もないことを望んでいました。当時は、それがトレンドでした。最近では、ドメインモデルはORMではなく、適切なドメインモデルを持ち、ORMやWebservicesをデータソースとして使用することで、この問題を解決しています。多くの人が指摘したように、JPA(ORM)をドメインモデルと見なさず、適切なドメインモデルを持って、サービスが適切な場所です。

どのように解決するのですか?

理想的には、サービス層( マネージャー ) はビジネスロジックを表し、それゆえに @Transactional .

サービス層はDBオペレーションを実行するために、異なるDAOを呼び出すことができます。サービスメソッドに3つのDAOオペレーションがある状況を想定してみましょう。1番目のDAOオペレーションが失敗した場合、他の2つのオペレーションはまだ渡される可能性があり、一貫性のないDBの状態で終わるでしょう。サービスレイヤーにアノテートすることで、このような事態を回避することができます。