2015-03-02 18 views
0

我在使用hibernate的批處理事務中使用session.clear()時收到以下錯誤。org.hibernate.HibernateException:在Hibernate搜索中進行索引時出錯(事務完成前)

org.hibernate.HibernateException: Error while indexing in Hibernate Search (before transaction completion) 

我用下面的代碼

try { 
     for (TimeSheetEntity timeSheet : timeSheets) { 
      timeSheet.setActive(false); 
      try { 
       session.update(timeSheet); 

       count++; 

       if (count % 250 == 0 || totalCount == count) { 
        System.out.println(count); 

        session.flush(); 
        session.clear(); 
       } 
      } catch (HibernateException ex) { 
       logger.error(ArchiveImpl.class.getName(), ExceptionUtils.getStackTrace(ex) + "[" + timeSheet.getId() + "] "); 
      } catch (Exception ex) { 
       logger.error(ArchiveImpl.class.getName(), ExceptionUtils.getStackTrace(ex) + "[" + timeSheet.getId() + "] "); 
      } 
     } 

     sessionManager.commit(); 
    } catch (HibernateException ex) { 
     System.out.println(ex); 
     logger.error(ArchiveImpl.class.getName(), ExceptionUtils.getStackTrace(ex)); 
     sessionManager.abort(); 
    } finally { 
    } 

現在,如果我刪除session.clear();一切工作,因爲它假設。任何想法,爲什麼我不能在我的批處理事務中使用hibernate搜索清除?

回答

3

方法Session#flush()刷新到數據庫的更改。 使用FullTextSession#flushToIndexes()刷新由Hibernate Search管理的索引更改。

如果你需要clear()你的會話,你應該刷新這兩個,或者一些實體仍然會被列入索引,但不會再被管理,這是一個問題。

當您對數據庫執行刷新操作時,Hibernate Search不會自動刷新到索引,因爲在中止事務時,索引的刷新不會被撤消,所以最好是明確地決定哪一個(或兩者兼而有之)你想要發生的衝動。

+0

準確地說,我正在尋找的答案,非常感謝。 – 2015-03-03 13:30:00

0

那麼,你的電話session.clear();是在for循環。如果要關閉會話,請在循環結束後執行該操作。

+0

這對我來說並不完全有意義,如果您在for循環中不調用session.clear,則可能會出現內存不足異常。 Session.clear()應該只是清除L1緩存,而不是關閉會話嗎?我有其他的應用程序,我做這件事完全一樣,我沒有問題。我能想到的唯一的事情就是可能是罪魁禍首的關係表正在被延遲加載?批量插入的示例http://stackoverflow.com/questions/3788048/safely-clearing-hibernate-session-in-the-middle-of-large-transaction – 2015-03-02 20:56:32

+0

然後你有沒有嘗試過使用事務進行更新操作? – 2015-03-02 21:01:45

+0

是的,這是由框架會話管理器處理http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/hibernate/HibernateSessionManager.html – 2015-03-02 21:05:15

相關問題