HibernateDaoSupportを使用したHibernate連係(Spring1.2.1)
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を操作しない限りスレッドセーフとなっているようだ.

