SeasarのDBアクセスにHibernateを使う : Seaser Projectの全貌を探る(6) (2/3 ページ)
S2Hibernateを用いてDBアクセスを行う方法には、大きく分けてSessionオブジェクトを直接利用する方法と、アノテーションを用いることでSessionオブジェクトには直接触れない方法の2種類があります。後者の方法を実現するための仕組みをS2Hibernate.daoといいます。まずは前者の方法から説明していきましょう。
最初の例として、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の場合も紹介しましょう。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.