1、load,get
(1)當記錄不存在時候,get方法返回null,load方法產生異常java
(2)load方法能夠返回實體的代理類,get方法則返回真是的實體類sql
(3)load方法能夠充分利用hibernate的內部緩存和二級緩存中的現有數據,而get方法僅僅在內部緩存中進行數據查找,若是沒有發現數據則將越過二級緩存,直接調用SQL查詢數據庫。
(4) 也許別人把數據庫中的數據修改了,load如何在緩存中找到了數據,則不會再訪問數據庫,而get則會返回最新數據。
2、find,iterator
(1) iterator首先會獲取符合條件的記錄的id,再跟據id在本地緩存中查找數據,查找不到的再在數據庫中查找,結果再存在緩存中。N+1條SQL。
(2)find跟據生成的sql語句,直接訪問數據庫,查到的數據存在緩存中,一條sql。
3、Hibernate生成的DAO類中函數功能說明(merge,saveOrUpdate,lock)
數據庫
/** * 將傳入的detached狀態的對象的屬性複製到持久化對象中,並返回該持久化對象。 * 若是該session中沒有關聯的持久化對象,加載一個。 * 若是傳入對象未保存,保存一個副本並做爲持久對象返回,傳入對象依然保持detached狀態。 */ public Sysuser merge(Sysuser detachedInstance) { log.debug("merging Sysuser instance"); try { Sysuser result = (Sysuser) getHibernateTemplate().merge( detachedInstance); log.debug("merge successful"); return result; } catch (RuntimeException re) { log.error("merge failed", re); throw re; } } /** * 將傳入的對象持久化並保存。 若是對象未保存(Transient狀態),調用save方法保存。 * 若是對象已保存(Detached狀態),調用update方法將對象與Session從新關聯。 */ public void attachDirty(Sysuser instance) { log.debug("attaching dirty Sysuser instance"); try { getHibernateTemplate().saveOrUpdate(instance); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } } /** * 將傳入的對象狀態設置爲Transient狀態 */ public void attachClean(Sysuser instance) { log.debug("attaching clean Sysuser instance"); try { getHibernateTemplate().lock(instance, LockMode.NONE); log.debug("attach successful"); } catch (RuntimeException re) { log.error("attach failed", re); throw re; } }