HibernateTemplate的常用方法

 HibernateTemplate提供非常多的常用方法來完成基本的操作,比如通常的增加、刪除、修改、查詢等操作,Spring 2.0更增加對命名SQL查詢的支持,也增加對分頁的支持。大部分情況下,使用Hibernate的常規用法,就可完成大多數DAO對象的CRUD操作。下面是HibernateTemplate的常用方法簡介:


      void delete(Object entity):刪除指定持久化實例

      deleteAll(Collection entities):刪除集合內全部持久化類實例

      find(String queryString):根據HQL查詢字符串來返回實例集合

      findByNamedQuery(String queryName):根據命名查詢返回實例集合

      get(Class entityClass, Serializable id):根據主鍵加載特定持久化類的實例

      save(Object entity):保存新的實例

      saveOrUpdate(Object entity):根據實例狀態,選擇保存或者更新

      update(Object entity):更新實例的狀態,要求entity是持久狀態

      setMaxResults(int maxResults):設置分頁的大小

下面是一個完整DAO類的源代碼:
Java代碼  收藏代碼
  1. public class PersonDAOHibernate implements PersonDAO  
  2. {  
  3.     //採用log4j來完成調試時的日誌功能  
  4. private static Log log = LogFactory.getLog(NewsDAOHibernate.class);  
  5.     //以私有的成員變量來保存SessionFactory。  
  6. private SessionFactory sessionFactory;  
  7. //以私有變量的方式保存HibernateTemplate  
  8. private HibernateTemplate hibernateTemplate = null;  
  9.          //設值注入SessionFactory必需的setter方法  
  10.     public void setSessionFactory(SessionFactory sessionFactory)  
  11. {  
  12.            this.sessionFactory = sessionFactory;  
  13.     }  
  14.   
  15.          //初始化本DAO所需的HibernateTemplate  
  16.   
  17. public HIbernateTemplate getHibernateTemplate()  
  18.   
  19. {  
  20.          //首先,檢查原來的hibernateTemplate實例是否還存在  
  21.          if ( hibernateTemplate == null)  
  22.          {  
  23.                    //如果不存在,新建一個HibernateTemplate實例  
  24.                    hibernateTemplate = new HibernateTemplate(sessionFactory);  
  25.          }  
  26.          return hibernateTemplate;  
  27. }  
  28.   
  29.          //返回全部的人的實例  
  30.     public List getPersons()  
  31.          {          
  32.                    //通過HibernateTemplate的find方法返回Person的全部實例  
  33.            return getHibernateTemplate().find("from Person");  
  34.     }  
  35.   
  36.           
  37.     public void savePerson(Person person)  
  38.          {                   
  39.                    getHibernateTemplate().saveOrUpdate(person);  
  40.     }  
  41.   
  42.          /**  
  43.           * @ param personid 需要刪除Person實例的主鍵  
  44.           * /  
  45.     public void removePerson(int personid)  
  46.          {  
  47.                    //先加載特定實例  
  48.            Object p = getHibernateTemplate().load(Person.classnew Integer(personid));  
  49.                    //刪除特定實例  
  50.            getHibernateTemplate().delete(p);  
  51.     }   
 

二、get()與load()方法區別
hibernate中get方法和load方法的根本區別
如果你使用load方法,hibernate認爲該id對應的對象(數據庫記錄)在數據庫中是一定存在的,所以它可以放心的使用,它可以放心的使用代理來延遲加載該對象。在用到對象中的其他屬性數據時才查詢數據庫,但是萬一數據庫中不存在該記錄,那沒辦法,只能拋異常ObjectNotFoundException,所說的load方法拋異常是指在使用該對象的數據時,數據庫中不存在該數據時拋異常,而不是在創建這個對象時。由於session中的緩存對於hibernate來說是個相當廉價的資源,所以在load時會先查一下session緩存看看該id對應的對象是否存在,不存在則創建代理。所以如果你知道該id在數據庫中一定有對應記錄存在就可以使用load方法來實現延遲加載。
對於get方法,hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然後在二級緩存中查找,還沒有就查數據庫,數據庫中沒有就返回null。

雖然好多書中都這麼說:“get()永遠只返回實體類”,但實際上這是不正確的,get方法如果在session緩存中找到了該id對應的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關聯對象延遲加載過,那麼返回的還是原先的代理對象,而不是實體類對象,如果該代理對象還沒有加載實體數據(就是id以外的其他屬性數據),那麼它會查詢二級緩存或者數據庫來加載數據,但是返回的還是代理對象,只不過已經加載了實體數據。

前面已經講了,get方法首先查詢session緩存,沒有的話查詢二級緩存,最後查詢數據庫;反而load方法創建時首先查詢session緩存,沒有就創建代理,實際使用數據時才查詢二級緩存和數據庫。

總之對於get和load的根本區別,一句話,hibernate對於load方法認爲該數據在數據庫中一定存在,可以放心的使用代理來延遲加載,如果在使用過程中發現了問題,就拋異常;而對於get方法,hibernate一定要獲取到真實的數據,否則返回null。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章