2008年3月18日火曜日

SpringFrameworkとHibernateの連係 -HibernateTemplate編-

SpringFrameworkとHibernateを連携する方法を調査してみました

参考: Chapter 12. Object Relational Mapping(ORM) data access

SessionFactoryの設定

リソースルックアップのハードコードを避けるために、SpringFrameworkではJDBCデータソースやHiberanteのSessionFactoryなどのリソースをビーンとして定義することができます。

<beans>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432"/Tomcat/>
<property name="username" value="tomcat"/>
<property name="password" value="password"/>
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="mappingResources">
<list>
<value>マッピングファイル1.hbm.xml</value>
</list>
<list>
<value>マッピングファイル2.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
</value>
</property>
</bean>
</beans>

HibernateTemplate

DAOもしくはビジネスサービスのメソッドの基本的なプログラムモデルは以下のようになります。

public class ProductDaoImpl implements ProductDao {

private HibernateTemplate hibernateTemplate;

public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}

public Collection loadProductsByCategory(String category) throws DataAccessException {
return this.hibernateTemplate.find("from test.Product product where product.category=?", category);
}
}

オブジェクトの実装に関して特に制限はありませんが、SessionFactoryを渡してやる必要があります。SessionFactoryはどこからでも呼び出せますが、できればSpring IOCコンテナからsetSessionFactory()メソッドを利用して、Beanとして呼び出します。その例を以下に示します。

<beans>
<bean id="myProductDao" class="product.ProductDaoImpl">
<property name="sessionFactory" ref="mySessionFactory"/>
</bean>
</beans>

HibernateTemplateクラスは上記のような便利なメソッドのほか、HiberanteのSessionインタフェースで公開されているメソッドを備えています。HiberanteTemplateにないメソッドを利用しようとしてSessionクラスへ直接アクセスするには、以下のようなコールバックベースの低レベルの方法をとることもできます。

public class ProductDaoImpl implements ProductDao {

private HibernateTemplate hibernateTemplate;

public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}

public Collection loadProductsByCategory(final String category) throws DataAccessException {
return this.hibernateTemplate.execute(new HibernateCallback() {

public Object doInHibernate(Session session) {
Criteria criteria = session.createCriteria(Product.class);
criteria.add(Expression.eq("category", category));
criteria.setMaxResults(6);
return criteria.list();
}
};
}
}
HibernateTemplateのAPI

 参考: Classs HibernateTemplate

Hibernateのデータアクセス処理を簡素化するヘルパークラス。org.springframework.daoの例外ヒエラルキーに沿ってHibernateExceptionをDataAccessExceptionへ自動的に変換します。
execute()が主となるメソッドで、HibernateCallbackインタフェースを実装したHibernateのアクセスコードを備えています。また、セッションの制御機能も備えており、Hibernateセッションの取得やクローズや関連した例外処理をする必要はありません。

0 件のコメント: