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類的源代碼:
- public class PersonDAOHibernate implements PersonDAO
- {
- //採用log4j來完成調試時的日誌功能
- private static Log log = LogFactory.getLog(NewsDAOHibernate.class);
- //以私有的成員變量來保存SessionFactory。
- private SessionFactory sessionFactory;
- //以私有變量的方式保存HibernateTemplate
- private HibernateTemplate hibernateTemplate = null;
- //設值注入SessionFactory必需的setter方法
- public void setSessionFactory(SessionFactory sessionFactory)
- {
- this.sessionFactory = sessionFactory;
- }
- //初始化本DAO所需的HibernateTemplate
- public HIbernateTemplate getHibernateTemplate()
- {
- //首先,檢查原來的hibernateTemplate實例是否還存在
- if ( hibernateTemplate == null)
- {
- //如果不存在,新建一個HibernateTemplate實例
- hibernateTemplate = new HibernateTemplate(sessionFactory);
- }
- return hibernateTemplate;
- }
- //返回全部的人的實例
- public List getPersons()
- {
- //通過HibernateTemplate的find方法返回Person的全部實例
- return getHibernateTemplate().find("from Person");
- }
- public void savePerson(Person person)
- {
- getHibernateTemplate().saveOrUpdate(person);
- }
- /**
- * @ param personid 需要刪除Person實例的主鍵
- * /
- public void removePerson(int personid)
- {
- //先加載特定實例
- Object p = getHibernateTemplate().load(Person.class, new Integer(personid));
- //刪除特定實例
- getHibernateTemplate().delete(p);
- }
二、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。
如果你使用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。