2011-04-08 35 views
0

我有一個對象列表,對於我正在執行的每個對象Session.update(),何時應該調用Session.flush()?列表完成迭代後或每次更新後?該代碼段爲:在Hibernate會話批量更新中調用Session.flush

public void updateUserAssignmentInfo(final long itemId) { 
    getHibernateTemplate().execute(new HibernateCallback() { 

     public Object doInHibernate(Session session) throws HibernateException, SQLException { 
      session.flush(); 
      session.setCacheMode(CacheMode.IGNORE); 
      List<UserAssignmentInfo> userAssignmentInfos = session.createQuery("from UserAssignmentInfo as userAssignmentInfo where userAssignmentInfo.itemId = " + itemId).list(); 
      if (userAssignmentInfos.size() == 0) { 
       return null; 
      } 
      for (UserAssignmentInfo userAssignmentInfo : userAssignmentInfos) { 
       userAssignmentInfo.setIsCurrentlyAssigned(false); 
       session.update(userAssignmentInfo); 
       // should I call flush here? 
      } 
      session.flush(); // or here? 
      return null; 
     } 
    }); 
} 

回答

3

通常你不需要調用flush()在所有 - Hibernate的執行查詢之前自動刷新會議和事務提交之前。只有當您有一些理由來覆蓋默認行爲時,才應使用手動flush()

此外,在這種情況下,您甚至不需要撥打update()--由於實體是在同一事務中加載的,因此它們狀態的更改將自動傳播到數據庫。

0

在批量操作中,將沖洗模式設置爲手動可能有意義。原因是如果你在做讓我們說30k更新,並且每次更新之前都有select來驗證某些條件,那麼hibernate將在每次查詢之前刷新會話,甚至讀取。這會使性能下降。 我們已經看到了這種行爲,並通過將刷新模式轉爲手動,可以看到性能的提高