SeasarのDBアクセスにHibernateを使う:Seaser Projectの全貌を探る(6)(3/3 ページ)
Seasar(シーサー)は、国内のコミュニティ「The Seasar Project」によって開発が行われているオープンソースプロダクトだ。DI+AOPコンテナとして評価が高いSeasarV2は、J2EE開発の現場にも影響力を持ち始めた。例えば電通国際情報サービスがSeasar Projectを正式に支援することを表明し、2005年6月からは同社による商用サポートサービスが開始されている。本連載では、同プロジェクトの代表的なプロダクトを紹介していく。(編集局)
S2Hibernate.daoによるDBアクセス
今度は、HibernateのSessionオブジェクトを操作する代わりに、S2ではおなじみのアノテーションを用いた設定を行ってみましょう。S2のアノテーションについては何度も説明していますが、これはS2独自のstatic final型の変数を用いた設定の仕組みのことをいい、JDK5.0のそれとは別物です。
S2Hibernateで用意されているアノテーションは、以下に示すBEAN・HQL・ARGS・PROPERTYの4種類があります。
- BEANアノテーション
DAOと関連付けられるDTOクラスを設定します
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
- HQLアノテーション
“(メソッド名)_HQL”という変数名を持つString型の変数にHibernateで実行するHQL文を設定します。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
- ARGSアノテーション
DAOインターフェイスのメソッドに設定されている引数の名称を設定します。このとき“maxResults”と“firstResult”という名称が、それぞれデータを取得する件数とデータ取得の開始行を表す予約語となっているため、それらの値をメソッドの引数とする場合には、引数の名称を必ずこれに合わせる必要があります。
また、このアノテーションに設定された引数名がDTOのプロパティ名と同じである場合は、自動的にこれらがwhere句に追加されます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
また、引数名に不等号をつけると、where句が不等号をつけた状態で生成されます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
- PROPERTYアノテーション
テーブルのカラム名とDTOのプロパティ名が異なる場合にARGS用います。HQL文である値の範囲を制限する場合などに適しています。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
SELECT編
では、これらのアノテーションにより、どのようにしてDBアクセスが行われるのかを紹介しましょう。まずは金額ある範囲にある支出についてaccountテーブルから取得してみましょう。
まずDAOインターフェイスをリスト11のように作成します。ここではHQL・ARGSの各アノテーションを用いています。これによりamountプロパティの値がfromExpenseからtoExpenseの範囲にあるAccountオブジェクトを取得することができます。そしてこの実装クラスは作成せずに、リスト12のようにして実行します。結果はリスト13のようになります。この間Sessionオブジェクトには全くふれずにデータを取得する処理を行うことができました。
ちなみに、この処理を実行するにあたってdiconファイルをリスト14のように作成しました。アスペクトの設定としてs2hibernate3.interceptorが追加されています。これはs2hibernate3.diconに設定されているもので、アノテーションの解釈とDBアクセスを可能に必要なものです。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
INSERT、UPDATE、DELETE編
SELECT以外のINSERT、UPDATE、DELETEについては、アノテーションすら設定せずに処理を実行することができます。ではそれぞれの処理をどのようにして行うかというと、メソッドの名称によってどんな処理を行えばよいのかを決定します。メソッドの引数はDTO、戻り値はvoidであることが条件です。
注意すべきとこととしては、これに関するドキュメントでの記述と実際の処理とが一部で食い違っているところがあるということです。筆者が確かめたところでは、UPDATEを行うメソッドは「update,merge」で始まる名称を持つメソッドに限定されるという点です。これについてドキュメントでは「update,modify,store」で始まる名称を持つメソッドはUPDATE処理が自動的に行われる旨が記述されています。これについては改善を望みたいところです。また、INSERTを行うメソッドはinsertで始まる名称もその対象になります。詳細は、付属ドキュメントの「メソッドの定義」を参照してください。
DAOインターフェイスとINSERT処理の例をリスト15、リスト16にそれぞれ示します。アノテーションが無かったら、一見してDBアクセスをしているように感じないところですが、これもS2HibernateとHibernateによるO/Rマッピングのおかげといえるでしょう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
今回はS2でHibernateを利用できるようにするS2Hibernateを紹介しました。Hibernateをバーション2から同3に移行する場合には、再ビルドやAPIの変更などの注意が必要であるものの、新規に使い始める場合には、開発者がSessionオブジェクトにふれなくてもよいなどの利点があります。Hibernateのスキルがある方はぜひ試してみてください。
次回からはWeb層に関連するプロダクトを紹介します。はじめは、非常に良く知られているフレームワークStrutsを利用できるようにするS2Strutsをご紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.