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;
      }
}