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

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

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

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

#ref(schema.png)


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

#ref(bl.png)

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


このとき、処理によってはトランザクション境界がMembarDAOを呼び出すビジネスメソッドでよい場合もあるし、またある場合は複数のDAOを呼び出して、それがトランザクションの単位になる場合もあるわけです。
このとき、ある処理の場合はメソッド単位でトランザクション管理し、ほかの処理の場合は複数のメソッドにまたがってトランザクション管理したい場合があります。上の例だと、
-addMemberはMemberを登録する
-addGroupはWorkGroupを登録する
-addはMemberをGroupに追加する。引数のメンバーがいなかったらaddMemberでMemberを登録する。引数のグループなかったら、例外をThrowする

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

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

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

#ref(class.png)






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


BLのビジネスメソッドに対してトランザクション処理を宣言的に追加することができます。







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

#comment
#topicpath


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


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