HibernateTemplate還提供一種更加靈活的方式來操作數(shù)據(jù)庫,通過這種方式可以完全使用Hibernate的操作方式。HibernateTemplate的靈活訪問方式是通過如下兩個方法完成:
q Object execute(HibernateCallback action)
q List execute(HibernateCallback action)
這兩個方法都需要一個HibernateCallback的實例,HibernateCallback實例可在任何有效的Hibernate數(shù)據(jù)訪問中使用。程序開發(fā)者通過HibernateCallback,可以完全使用Hibernate靈活的方式來訪問數(shù)據(jù)庫,解決Spring封裝Hibernate后靈活性不足的缺陷。HibernateCallback是一個接口,該接口只有一個方法doInHibernate(org.hibernate.Session session),該方法只有一個參數(shù)Session。
通常,程序中采用實現(xiàn)HibernateCallback的匿名內(nèi)部類來獲取HibernateCallback的實例,方法doInHibernate的方法體就是Spring執(zhí)行的持久化操作。具體代碼如下:
public class PersonDaoImpl implements PersonDao
{
//私有實例變量保存SessionFactory
private SessionFactory sessionFactory;
//依賴注入必須的setter方法
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
/**
* 通過人名查找所有匹配該名的Person實例
* @param name 匹配的人名
* @return 匹配該任命的全部Person集合
*/
public List findPersonsByName(final String name)
{
//創(chuàng)建HibernateTemplate實例
HibernateTemplate hibernateTemplate =
new HibernateTemplate(this.sessionFactory);
//返回HibernateTemplate的execute的結(jié)果
return (List) hibernateTemplate.execute(
//創(chuàng)建匿名內(nèi)部類
new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException
{
//使用條件查詢的方法返回
List result = session.createCriteria(Person.class)
.add(Restrictions.like(“name”, name+”%”)
.list();
return result;
}
});
}
}
注意:方法doInHibernate方法內(nèi)可以訪問Session,該Session對象是綁定到該線程的Session實例。該方法內(nèi)的持久層操作,與不使用Spring時的持久層操作完全相同。這保證對于復雜的持久層訪問,依然可以使用Hibernate的訪問方式。
posted on 2007-10-01 19:54
Ke 閱讀(3677)
評論(0) 編輯 收藏 所屬分類:
hibernate