連載
» 2006年01月19日 00時00分 公開

Seaser Projectの全貌を探る(6):SeasarのDBアクセスにHibernateを使う (1/3)

Seasar(シーサー)は、国内のコミュニティ「The Seasar Project」によって開発が行われているオープンソースプロダクトだ。DI+AOPコンテナとして評価が高いSeasarV2は、J2EE開発の現場にも影響力を持ち始めた。例えば電通国際情報サービスがSeasar Projectを正式に支援することを表明し、2005年6月からは同社による商用サポートサービスが開始されている。本連載では、同プロジェクトの代表的なプロダクトを紹介していく。(編集局)

[沖林正紀,@IT]

 これまでS2本体と関連するプロダクトでDBアクセスを行う方法として、第3回「SeasarV2によるDBアクセス機能」でS2JDBC、第5回「SeasarのO/RマッピングツールS2Dao」でS2Daoを紹介してきました。今回は、O/Rマッピングツールとしてよく知られているHibernateを用いたDBアクセスを可能にするS2Hibernateを取り上げます。

 今回紹介するS2Hibernateのバージョンは、本稿執筆時点で最新の1.1.0です。これは、前バージョンのS2Hibernate1.0.6に、「シーサーサンプルプロジェクト」でHibernate3対応版として公開されていたS2Hibernate3-V1.0.6b4をマージしたものとなっています(リリースノート)。本稿では、S2HibernateによってSeasarV2とHibernate3を組み合わせる方法を紹介していきます。

S2Hibernateの特長

 DBアクセスにHibernateを用いるということは、過去に紹介した2つの方法とは異なる特長が浮かび上がってきます。それは、Hibernateを用いることで、O/Rマッピングの設定をS2関連のXMLファイルやJavaソースコードから分離できるということです。

 S2JDBCでは、データベースに保存されているデータをオブジェクトのプロパティに格納する際に、JDBC APIを用いた格納処理をJavaソースコードで記述しなければなりません。S2Daoの場合は、XMLファイルをマッピングの設定に用いない代わりに、TABLEやCOLUMNなどのアノテーションによりO/Rマッピングの設定を行っていました。

 S2Hibernateの場合、Javaソースコードで記述が必要なのは、データベースとのマッピングよりも、DAOとデータを運ぶDTO(POJO)とのマッピングです。後ほど紹介しますが、S2HibernateにもJavaソースコードに記述する変数であるアノテーション(JDK 5.0のそれとは別物)が用意されており、それらによってDAOとDTOとのマッピングができるようになっています。

 また、もう1つの特長として、Hibernateを用いたアプリケーションでは必ず登場するSessionオブジェクトを開発者が管理しなくてもよいということです。具体的には、DBアクセスにSessionオブジェクトを用いるにしても、データベースの接続・切断やトランザクションの開始・コミット・ロールバックなどの処理はS2Hibernateがやってくれます。ですから、Javaソースコードによる処理とHibernateによるDB関連の処理のそれぞれを開発する作業を分離しやすくなります。さらに、後ほど紹介する方法を用いると、Sessionオブジェクトに開発者が直接触れずにDBアクセスを行うこともできます。

S2Hibernateのセットアップ

クラスパス(CLASSPATH)の追加

 S2Hibernateのセットアップは、ほかのS2関連のプロダクトと同様に、ダウンロードサイト(http://sourceforge.jp/projects/seasar/files/?release_id=15272#15272)からダウンロードしたモジュールを空き容量(約12MBytes以上)が確保できる記憶領域に展開し、その後に生成されたs2hibernate\libフォルダにある、S2本体を含めたすべてのJARファイルのパスをクラスパス(CLASSPATH)に追加します。これでS2Hibernateを利用できる環境が整います。ちなみに、S2Hibernate1.1.0に含まれるS2本体のバージョンは2.2.9です。

接続するデータベースの設定(j2ee.dicon、hibernate3.cfg.xml)

 そして、アプリケーションから接続するデータベースに関する設定を、S2のdiconファイルj2ee.diconとHibernateの設定ファイルhibernate3.cfg.xmlに記述します。本稿ではデータベースにMySQL4.1.13a、JDBCドライバにConnector/J3.1.10を用います。どちらのファイルもサンプルがs2hibernate\srcフォルダにありますので、それぞれ実行環境にコピーしたものを変更して用いることにします。ちなみに、Hibernate2対応の場合はhibernate.cfg.xmlをサンプルとして用いてください。

 リスト1はj2ee.diconでMySQLを用いるための設定を記述した例です。リスト2はHibernateにおけるデータベースの設定を記述したものです。ここで記述している設定はdialect・show_sqlとマッピング設定ファイルの名称(myfirst.hbm.xml)のみです。

 Hibernateのみを用いるアプリケーションの場合は、JDBCドライバや接続用URLなどの設定をこちらのファイルに記述するのですが、S2Hibernateの場合はそれらを必ずj2ee.diconに記述してください。

リスト1 j2ee.diconにおけるMySQLの設定(抜粋)
  <?xml version="1.0" encoding="Shift_JIS"?>
  <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
  "http://www.seasar.org/dtd/components.dtd">
  <components namespace="j2ee">
    <!-- 省略 -->
    <component name="xaDataSource"
      class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
      <property name="driverClassName">
           "com.mysql.jdbc.Driver"
      </property>
      <property name="URL">
           "jdbc:mysql://localhost:3306/accountdb"
      </property>
      <property name="user">"root"</property>
      <property name="password">"admin"</property>
    </component>
    <!-- 省略 -->
  </components>

リスト2 Hibernateのデータベース設定(hibernate3.cfg.xml)
  <?xml version="1.0" encoding="Windows-31J"?>
  <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  <hibernate-configuration>
    <session-factory>
      <!-- データベースの設定 -->
      <property name="dialect">
             org.hibernate.dialect.MySQLDialect
      </property>
      <!-- 実行したSQLをログに残す -->
      <property name="show_sql">true</property>
      <!-- マッピングの設定 -->
      <mapping resource="myfirst.hbm.xml" />
    </session-factory>
  </hibernate-configuration>

O/Rマッピングの設定

 最後に、HibernateのO/Rマッピング設定を記述したファイルを用意します。DBアクセスに用いるデータベースとテーブルは第3回第5回と同様のものです。また、データを運ぶために用いるDTOも、これまでどおりプロパティとsetter/getterメソッドのみの、ごく基本的なPOJOです。

 リスト3に、HibernateによるO/Rマッピング設定を記述したファイルの内容を示します。ここにはデータベースのaccountテーブルとAccountオブジェクトとのマッピング、そしてcategoryテーブルとCategoryオブジェクトとのマッピングがそれぞれ設定されています。

 AccountクラスのプロパティにCategoryオブジェクトが存在していますが、cascade属性の設定により、Accountクラスにデータが格納されるときにCategoryオブジェクトのプロパティも一緒に格納されるようになっています。

リスト3 O/Rマッピングの設定(myfirst.hbm.xml)
  <?xml version="1.0" encoding="Windows-31J"?>
  <!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  <hibernate-mapping package="myfirst.hibernate" auto-import="true">
    <!-- カテゴリー(Category)のマッピング -->
    <class name="Category" table="category">
      <id name="id" column="id" type="integer">
        <generator class="assigned" />
      </id>
      <property name="name" column="name" not-null="true" unique="true" />
      <loader query-ref="myfirst.hibernate.CategoryDao_getCategoryById" />
    </class>
    <!-- 入出金(Account)のマッピング -->
    <class name="Account" table="account">
      <id name="id" column="id" type="integer">
        <generator class="assigned" />
      </id>
      <many-to-one name="category"  class="Category" 
            column="id_cat" cascade="persist" lazy="true" />
      <property name="title"        type="string" 
            not-null="true" />
      <property name="amount"       type="integer"
            not-null="true" />
      <property name="memo"         type="string" />
      <property name="createDate"   type="timestamp"
            column="date_create"  />
      <property name="modifiedDate" type="timestamp"
            column="date_modified" />
    </class>
    <!-- カテゴリー関連のクエリ -->
    <sql-query name="myfirst.hibernate.CategoryDao_getCategoryById">
      <return alias="c" class="Category" />
      SELECT id AS {c.id}, name AS {c.name} FROM category WHERE id=?
    </sql-query>
    <!-- 小遣帳関連のクエリ -->
    <query name="myfirst.hibernate.AccountDao_getAccounts">
      from Account a order by a.id
    </query>
  </hibernate-mapping> 

S2Hibernate1.1.0をHibernate2対応にする

本稿で紹介するS2Hibernate1.1.0はHibernate3対応版ですが、何らかの事情でHibernate2対応にしたい場合には、ダウンロードしたモジュールを以下のように再ビルドする必要があります。

・S2Hibernate1.1.0をHibernate2対応にする方法(再ビルド)

(1)ダウンロードしたモジュールを展開した後に生成されたs2hibernateフォルダにあるbuild.xmlファイルの先頭から12行目を以下のように書き換える
書き換え前 <property name="package" value="org/seasar/hibernate3/" />
書き換え後 <property name="package" value="org/seasar/hibernate/" />
(2)Antを実行してコンパイルとJARファイルの生成を行う
(3)s2hibernate\libフォルダのs2-hibernate-1.1.0.jarファイルが更新され、org.seasar.hibernateパッケージのclassファイルがこのファイルに収められていることを確認

逆に、S2Hibernate1.1.0をHibernate3対応に戻す場合には、build.xmlファイルを書き換え前の状態に戻して再ビルドし、s2-hibernate-1.1.0.jarファイルにorg.seasar.hibernate3パッケージのclassファイルが収められていることを確認してください。


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。