ファイヤープロジェクト
HibernateDaoSupportを使用したHibernate連係(Spring1.2.1)
2005-08-12T13:45+09:00   matsu
SpringのHibernate連係では,直接Hibernateを操作するサポートクラスとして,HibernateDaoSupportがあるようなので,試してみた.
HibernateTemplateを使用したHibernate連係の例を以前に記述した. この方法では,Hibernateを直接操作する必要がほとんどなかったが,Hibernateを直接操作できないので,(繁雑かもしれないが)柔軟にHibernateを操作することができない. このような場合,当然Springの設定の枠組のみを使用して,あとはHibernateを直接使用する,ということもできる. こうすればSpringに依存しすぎることもない. だが,一部のメソッドのみHibernateを直接操作したいがそれ以外のメソッドはHibernateTemplateで手軽に作成したい場合や,Springが提供するDAOサポート(DAO関連操作のDataAccessException構造や,データアクセス時の各種例外をSprigのエラーコードに統一変換する機能などがある)を使用したい場合のために,HibernateDaoSupportというサポートクラスが提供されている. 本頁では,HibernateDaoSupportを拡張したDAOを作成し,Hibernatを直接使用するメソッド,HibernateTemplateを使用するメソッドを実装してみる.
以下に本頁のサンプルのbeans.xmlを示す.
id値sampleDaoは,以前作成したものを同じI/FでHibernateDaoSupportを使用して実装するbeanである. ここでは,sessionFactoryと,hibernateTemplateを設定している. これらのアクセサはどちらもHibernateDaoSupportにて実装されているので,サブクラスで実装する必要はない. hibernateTemplateの設定では,さらにbeanを定義している.
    <property name="hibernateTemplate">
      <bean class="org.springframework.orm.hibernate3.HibernateTemplate">
            <constructor-arg><ref bean="sampleSessionFactory"/></constructor-arg>
      </bean>
    </property>
HibernateDaoSupportのgetHibernateTemplateメソッドは,setHibernateTemplateにて設定したものを返すだけなので,ここで設定してしまっている. 同時にそのHibernateTemplateにsessionFactoryも設定している. 以上がbeans.xmlのポイントである.
以下にHibernateDaoSupprotのサブクラスである,SampleDaoを示す.
メソッドupdate以外は,すべてHibernateを直接操作している. 例としてメソッドsaveを見てみる.
    public Object save(SampleBean sampleBean) {
	Session session = getSession(true);
	Transaction transaction= session.beginTransaction();
	Object result = null;

	try {
	    result = session.save(sampleBean);
        } catch (HibernateException ex) {
            throw convertHibernateAccessException(ex);
        } finally {
	    try {
		transaction.commit();
		session.close();
	    } catch (HibernateException ex) {
		throw convertHibernateAccessException(ex);
	    }
	}
	return result;
    }
Sessionは以下で取得している.
protected final org.hibernate.Session getSession(boolean allowCreate)
  throws DataAccessResourceFailureException, IllegalStateException
このメソッドでは,現在のトランザクションがあればそのSessionを返す. 現在のトランザクションがなければ,引数allowCreateに応じて動作する. すなわちtrueなら新規Session,falseならDataAccessResourceFailureExceptionを投げる. あとはHibernateの世界の話となるが,例外処理でSprigのDataAccessException構造を扱うためのサポートメソッドを使用している.
        } catch (HibernateException ex) {
            throw convertHibernateAccessException(ex);
        } finally {
	    try {
		transaction.commit();
		session.close();
	    } catch (HibernateException ex) {
		throw convertHibernateAccessException(ex);
	    }
	}
convertHibernateAccessExceptionがそれである. このメソッドでは,Hibernateの例外構造をSpring例外構造に変換する. さて,メソッドupdateではHibernateTemplateを使用している.
    public void update(SampleBean sampleBean) {
        getHibernateTemplate().update(sampleBean);
    }
getHibernateTemplateで,HibernateTemplateを取得している. これは前節のbeans.xmlによって設定されたものである. HibernateTemplateは,ソースをちらった見た限り,setterを操作しない限りスレッドセーフとなっているようだ.
matsu(C)
Since 2002
Mail to matsu