// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents

**Hibernateとトランザクション管理に関する課題 [#se9f327a]

HibernateベースのDAOを作った場合に、トランザクション処理をどのように記述するかが問題になることがあります。

たとえば下記のような二つのテーブル

#ref(schema.png)


に対してそれぞれMemberDAOとWorkGroupDAOを作ると思います。さらにそのDAOを使用するビジネスメソッド、たとえば

#ref(bl.png)

なんてのが定義されると思います。


このとき、ある処理の場合はメソッド単位でトランザクション管理し、ほかの処理の場合は複数のメソッドにまたがってトランザクション管理したい場合があります。上の例だと、
-addMemberはMemberを登録する
-addGroupはWorkGroupを登録する
-addはMemberをGroupに追加する。引数のメンバーがいなかったらaddMemberでMemberを登録する。引数のグループなかったら、例外をThrowする

とした場合、
-メンバーを登録しようとしてaddMemberを呼び出した場合は、addMember内でトランザクションが開始され、終了すればいい。
-add内でサブルーチン(<-古っ)としてaddMemberが呼ばれる場合は、addでトランザクションが開始され、終了されるのでaddMemberはすでにあるトランザクションに参加すればよい

となります。二つめの例を考えるとaddMember内でトランザクション開始と終了の処理をしちゃうとまずいわけですね。Springではこの辺を、トランザクション処理を宣言的に記述することで解決しています。

ところで今回考えるクラス群の全体像は以下の通りです。

#ref(class.png)

またトランザクション処理を考慮しない状態のSpringの設定は以下の通りになっています。

#ref(bean.png)
#ref(bean2.png)




**Springを使ってトランザクション処理を記述する [#la131913]


BLのビジネスメソッドに対してトランザクション処理を宣言的に追加することができます。
BLのビジネスメソッドに対してトランザクション処理を宣言的に追加することができます。それにはBLの名前をuserManagerBLからuserManagerBLTargetに変更し、userManagerBLを新規に作成します。プログラムが呼ばれる流れとしては
 BLを使うプログラム -> userManagerBL
だったのを
 BLを使うプログラム -> userManagerBL -> userManagerBLTarget
となり、外部から見たら見た目は同じだけど、実際のBLの間に別のクラスが挟まれる用になります。具体的にはSpringの設定を以下のように変更します。

#ref(after.png)









----
この記事は
#vote(おもしろかった,そうでもない)

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS