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

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

[沖林正紀,@IT]

 S2Hibernateを用いてDBアクセスを行う方法には、大きく分けてSessionオブジェクトを直接利用する方法と、アノテーションを用いることでSessionオブジェクトには直接触れない方法の2種類があります。後者の方法を実現するための仕組みをS2Hibernate.daoといいます。まずは前者の方法から説明していきましょう。

SessionオブジェクトによるDBアクセス

SELECT編

 最初の例として、categoryテーブルに保存されているデータをCategoryオブジェクトを要素とするListとして取得する方法を紹介しましょう。

 まずDAOインターフェイスとして、Listを戻り値とするgetCategories()メソッドを作成します(リスト4)。次にこのメソッドの実装クラスを作成します(リスト5)。このとき実装クラスのコンストラクタにorg.seasar.hibernate3.S2SessionFactory型の引数を設定することを忘れないでください。この引数はHibernateのSessionFactoryをラップするものです。この実装クラスはS2のコンテナからリスト6のようにして呼び出し、実装したメソッドを実行すればリスト7のような結果が得られます。

 このとき、diconファイルの内容はリスト8のようになります。<include>タグでs2hibernate3.diconをインクルードしている以外は、S2JDBCやS2Daoのそれとほとんど変わりがありません。s2hibernate3.diconというファイルもj2ee.diconと同じフォルダにありますので、実行環境にコピーしたものを用いてください。また、Hibernate2対応の場合はs2hibernate.diconをコピーし、これをdiconファイルにインクルードしてください。

リスト4 DAOインターフェイス(CategoryDao.java)
package myfirst.hibernate;

import java.util.List;

public interface CategoryDao  {

  // DBアクセス用のメソッド
  List getCategories();
  // ..... 略 .....
}

  リスト5 リスト4の実装(CategoryDaoImpl.java)
package myfirst.hibernate;

import java.util.List;

import org.seasar.hibernate3.S2SessionFactory;
import org.hibernate.Session;

public class CategoryDaoImpl implements CategoryDao  {

  private S2SessionFactory sessionFactory;

  // コンストラクタでSessionFactoryオブジェクトをInjectionする
  public CategoryDaoImpl( S2SessionFactory sessionFactory ) {
    this.sessionFactory = sessionFactory;
  }

  // Sessionオブジェクト取得用
  private Session getSession()  {
    if ( sessionFactory != null )
       return sessionFactory.getSession();
    return null;
  }

  // categoryテーブルに保存されているデータをCategoryオブジェクトとして取得
  public List getCategories()  {
    List result = getSession().createQuery(
             "from Category c order by c.id" ).list();
    if ( result.size() > 0 )  {
      return result;
    }  else  {
      return null;
    }
  }

  // ..... 略 .....

}

リスト6 DBアクセスによりCategoryオブジェクトを取得
S2Container container = S2ContainerFactory.create( "diconファイルのパス" );
container.init();
try {
  CategoryDao dao = 
         (CategoryDao)container.getComponent( CategoryDao.class );
  for( Object c : dao.getCategories() ) 
         System.out.println( (Category)c );
  // ..... 略 .....
} finally {
  container.destroy();
}

  リスト7 リスト6の実行結果(抜粋)

Category [ id = 1, category = 食費 ]
Category [ id = 2, category = 交通費 ]
Category [ id = 3, category = 書籍代 ]
Category [ id = 4, category = 光熱費 ]
Category [ id = 5, category = 家賃 ]
Category [ id = 6, category = 給料 ]


リスト8 diconファイルの内容(category.dicon)
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
                     "http://www.seasar.org/dtd/components.dtd">
<components>
  <include path="s2hibernate3.dicon" />
  <component class="myfirst.hibernate.CategoryDaoImpl">
    <aspect>j2ee.requiredTx</aspect>
  </component>
</components>

Sessionオブジェクトの変更

本稿で用いているS2Hibernate1.1.0がHibernate3対応版となっていることは、これまでに説明しているとおりですが、これに伴って、S2HibernateのSessionオブジェクトは、Hibernateのorg.hibernate.Sessionを直接用いることになりました。それまでのS2Hibernate1.0.xではorg.seasar.hibernate.S2Sessionオブジェクトが用いられていましたので、findメソッドが使えなくなるなど、SessionオブジェクトのAPIが大きく変更されることになります。S2Hibernateのバージョンを移行する際には、この点に注意が必要です。


INSERT、UPDATE、DELETE編

 続いて、INSERT、UPDATE、DELETEの場合も紹介しましょう。HibernateのSessionオブジェクトを直接用いますので、このオブジェクトのメソッドでINSERT、UPDATE、DELETEを行う方法を知っていれば、それと同じ処理をDAOインターフェイスと実装クラスで実行できるようにします。実行結果は読者ご自身で確かめてみてください。

リスト9 DAOインターフェイス(CategoryDao.java)
package myfirst.hibernate;

import java.util.List;

public interface CategoryDao  {

  // DBアクセス用のメソッド
  void            insertCategory  ( Category   category );
  void            updateCategory  ( Category   category );
  void            deleteCategory  ( Category   category );
  // ..... 略 .....
}

  リスト10 リスト9の実装クラス(CategoryDaoImpl.java)
package myfirst.hibernate;

import java.util.List;

import org.seasar.hibernate3.S2SessionFactory;
import org.hibernate.Session;

public class CategoryDaoImpl implements CategoryDao  {

  private S2SessionFactory sessionFactory;

  // ..... コンストラクタなど(略) .....

  public void insertCategory  ( Category category )  {
    getSession().save( category );
  }

  public void updateCategory  ( Category category )  {
    getSession().update( category );
  }

  public void deleteCategory  ( Category category )  {
    getSession().delete( category );
  }

}

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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