ぶろぐ

日記です

Springがトランザクション管理の問題点を解決してくれるっぽい


Java EEな図


3つのDAOの処理が成功して、ひとつのトランザクションが成功する場合、Service層でトランザクションの管理をする必要がある、という話。
Spring Frameworkを使っていない場合

  • 複数DAOがあるとき、トランザクション管理に困ってるんすよねー
  • この図見てくださいよ、真面目にActionクラス、Serviceクラス、DAOクラス分けても、どうしてもトランザクション管理はクラス間を横断してしまうんすよ
  • 複数のテーブルを操作する必要があった場合、複数のDAOを呼ぶように作っています。1リクエスト1トランザクションとして、その様な場合、トランザクションはひとつのDAOだけに収まらず、Service Logicレイヤーまで影響してしまうんすよ…
  • Service Logicでトランザクションを管理する必要が出てくる、と
  • つまりDAOとServiceの切り分けに問題がある、と言うか悩んでいるんです…orz
  • トランザクションの話をService Logicまで持ってくると、依存性も高まるし、レイヤー分けてる意味が薄れてくるように思います。クラスは分けているのに債務は分けられていない、みたいな。自分のイメージあってますか?
  • 通常、トランザクションをService Logicで管理したいのであれば、HibernateのSessionをService Logicで管理しないといけなくなる、というのが自分の考えです。

この問題点を解決するのが

  • ここでSpring Frameworkを使うと、ServiceとDAOをラッパーしてトランザクション管理を代行してくれるんすよ
  • SpringがHibernateのSessionもろもろを管理してくれるので、トランザクション開始・終了をDaoでもなくServiceでもなく、Springがやってくれる
    • 仕組みとしては、Service Logicクラスにトランザクションの開始と終了でラッパーしているんだと思う。バイトコード操作?で。
      • まだ動かしていないし、そこまで追って調べていないからわからないけどさ

というのを考えてて、気づいたら色々書いていた。
自分の確認も含めて!!
これで合っているかな?

  • Entity
    • DBのカラムと、クラスのフィールドが一対一になるクラス。Hibernateマッピングしてある。
  • Model
    • StrutsでいうActionFormみたいなもん。Formの入力値を受け取るためのクラス
  • DTO
    • これが微妙なんだけど、多分Service Logicから返却される「結果出力用」のクラス。