2008年3月21日金曜日

SpringFrameworkとHibernateの連係 -HibernateDaoSupport編-

HibernateDaoSupportを利用したSpringFrameworkとHibernateの連係を調べてみました。
 参考: Implementing Spring-based DAOs without callbacks

HibernateTemplateを利用してDAOを実装する代わりに、Hibernateアクセスコードをコールバック内にラップすることをせずに、データアクセスコードを従来の方法で記述することも可能です。HibernateDaoSupportを基にしたクラスは、従来のトランザクションベースのセッションや、例外の変換メソッドを備えています。これらのコードは、トランザクション内で必ず処理させるため、getSession()メソッドのallowCreateに通常falseを渡します。

public class HibernateProductDao extends HibernateDaoSupport implements ProductDao {

public Collection loadProductsByCategory(String category) throws DataAccessException, MyException {
Session session = getSession(false);
try {
Query query = session.createQuery("from test.Product product where product.category=?");
query.setString(0, category);
List result = query.list();
if (result == null) {
throw new MyException("No search results.");
}
return result;
}
catch (HibernateException ex) {
throw convertHibernateAccessException(ex);
}
}
}

この手法の長所は、データへアクセスするコードでアプリケーション独自の例外をスローできる点です(一方HibenrateTemplateクラスでは、callback内でアプリケーション独自の例外をスローすることはできません)。但し、独自のチェックルーチンや例外をcallbackの後に実装することもできるので、依然HibernateTemplateを利用できます。
一般的には、HibernateTemplateクラスの便利なメソッドはシンプルで、たいていの場合に適しています。

「つまりたいていの場合はHibernateTemplateを使ったほうがいいよ」ということでしょうか。

0 件のコメント: