【Hibernate】HibernateCallback总结
HibernateCallback總結
HibernateTemplate提供了非常多的常用方法來 完成數據庫的基本操作,使得持久層訪問模板化 。只要創(chuàng)建HibernateTemplate實例后,注入一 個SessionFactory的引用就可以了,而無需手動 創(chuàng)建sessionFactory,從而可以更加智能的管理 Hibernate的Session,避免了對于try/catch的 大量使用。
HibernateTemplate操作數據庫的基本方法;
對于Hibernate的復雜用法HibernateCallBack, HibernateTemplate也提供了一種更加靈活的方 式來操作數據庫。通過這種方式可以完全使用 Hibernate的操作方式。
HibernateTemplate的靈活使用方式是通過如下方式完成的:
這三個方法都需要HibernateCallBack實例, HibernateCallBack實例可以在任何有效的數據 庫訪問中使用。開發(fā)者通過HibernateCallBack 可以完全使用Hibernate靈活的方式來訪問數據 庫,解決Spring封裝Hibernate后導致的靈活性 不足的缺陷。
HibernateCallback是一個接口,該接口只有一 個方法doInHibernate(org.hibernate.Session session), 該方法只有一個參數Session。
通常,程序中采用實現HibernateCallback的匿 名內部類來獲取HibernateCallback的實例, 方 法doInHibernate的方法體就是Spring執(zhí)行的持 久化操作。
如下為一個HibernateCallBack實現的分頁查詢工具類:
/*** HibernateCallBack實現分頁查詢* @author lmb**/ import java.sql.SQLException; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class HibernateCallBackPageUtil extends HibernateDaoSupport{/*** 使用hql語句進行分頁查詢(無參數)** @param hql 需要查詢的 hql語句* @param offset 第一條記錄索引* @param pageSize 每頁需要顯示的記錄數* @return 當前頁的所有記錄*/public List findByPage(final String hql,final int offset,final int pageSize){//通過一個HibernateCallBack對象來執(zhí)行查詢List list = getHibernateTemplate().executeFind(new HibernateCallback(){//實現HibernateCallBack方法必須且唯一要實現的方法@Overridepublic Object doInHibernate(Session session)throws HibernateException, SQLException {//執(zhí)行hibernate分頁查詢List result = session.createQuery(hql).setFirstResult(offset) //設置第一條記錄索引.setMaxResults(pageSize) //設置每頁需要顯示的記錄數.list();return result;}});return list;}/*** 使用hql語句進行分頁查詢(有一個入參)** @param hql 需要查詢的 hql語句* @param value 如果 hql有一個參數需要傳入,value就是傳入 hql語句的參數* @param offset 第一條記錄索引* @param pageSize 每頁需要顯示的記錄數* @return 當前頁的所有記錄*/public List findByPage(final String hql,final Object value, final int offset,final int pageSize){//通過一個hibernate對象來執(zhí)行查詢List list = getHibernateTemplate().executeFind(new HibernateCallback(){//實現HibernateCallBack方法必需且唯一要實現的方法@Overridepublic Object doInHibernate(Session session)throws HibernateException, SQLException {//執(zhí)行hibernate分頁查詢List result = session.createQuery(hql).setParameter(0, value) //為hql 語句傳入參.setFirstResult(offset) //設置第一條記錄索引.setMaxResults(pageSize) //設置每頁需要顯示的記錄數.list();return result;}});return list;}/*** 使用hql語句進行分頁查詢(有多個入參)** @param hql 需要查詢的 hql語句* @param value 如果 hql有多個個參數需要傳入,values就是傳入 hql的參數數組* @param offset 第一條記錄索引* @param pageSize 每頁需要顯示的記錄數* @return 當前頁的所有記錄*/public List findByPage(final String hql,final Object[] values, final int offset,final int pageSize){//通過一個hibernate對象來執(zhí)行查詢List list = getHibernateTemplate().executeFind(new HibernateCallback(){//實現hibernateCallBack方法必需且唯一要實現的方法@Overridepublic Object doInHibernate(Session session)throws HibernateException, SQLException {//執(zhí)行hibernate分頁查詢Query query = session.createQuery(hql);//為hql 語句傳參for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}List result = query.setFirstResult(offset).setMaxResults(pageSize).list();return result;}});return list;}}為什么要使用HibernateCallBack:
1.this.getSession() 是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一個方法,它可以從當前事務或者一個新的事務獲得一個hibernate session,需要程序維護session(手動關閉session) ;
2.this.getHibernateTemplate().getSessionFactory().getCurrentSession()/openSession()則從spring中獲取session ,getCurrentSession()創(chuàng)建的Session會綁定到當前的線程中去、而采用OpenSession()則不會。 采用getCurrentSession()創(chuàng)建的Session在commit或rollback后會自動關閉,采用OpenSession()必須手動關閉 ;
3.通過new HibernateCallback(){XXX}獲得的session是當前線程中的session ;
4.hibernateTemplate會確保當前hibernate的session對象的正確打開和關閉,并直接參與到事物管理中去,template實例不僅是線程安全的同時也是可重用的;
5.不提倡用getSession()來獲得session實現,因為這樣拿到的session是hibernate最原始的session不享有spring提供的模板支持需要手動的關閉session,可以使用new HibernateCallback(){xxx}得到session ;
6.回調這個東西歷史很久了。我的記憶中C的windows編程中就有了。 基本原理跟好萊塢原則一樣,Don’t call me,I’ll call you. 編程上來說,一般使用一個庫或類時,是你主動調用人家的API,這個叫Call,有的時候這樣不能滿足需要,需要你注冊你自己的程序(比如一個對象),然后讓人家在合適的時候來調用你,這叫Callback。設計模式中的Observer就是例子。基于事件的編程方式,比如經典的VB、Delphi里用的,那些事件的處理程序都是被調用的方法,都可成為回調(Callback)方法。
7.一個回調實現能夠有效地在任何Hibernate數據訪問中使用。HibernateTemplate 會確保當前Hibernate的 Session 對象的正確打開和關閉,并直接參與到事務管理中去。 Template實例不僅是線程安全的,同時它也是可重用的。因而他們可以作為外部對象的實例變量而被持有。對于那些簡單的諸如find、load、 saveOrUpdate或者delete操作的調用,HibernateTemplate 提供可選擇的快捷函數來替換這種回調的實現。 不僅如此,Spring還提供了一個簡便的 HibernateDaoSupport 基類,這個類提供了 setSessionFactory(..) 方法來接受一個 SessionFactory 對象,同時提供了 getSessionFactory() 和 getHibernateTemplate() 方法給子類使用。 綜合了這些,對于那些典型的業(yè)務需求,就有了一個非常簡單的DAO實現。
總結
以上是生活随笔為你收集整理的【Hibernate】HibernateCallback总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Hibernate】getHibern
- 下一篇: 【Hibernate】getHibern