2011-09-21 70 views
2

我使用Hibernate 3.6.3決賽和Hibernate 3.4.1搜索。 我寫了一個HQL刪除查詢。這些對象將從數據庫中刪除,但在事務完成後,它們不會從Lucene索引中刪除。 這是詢問:Hibernate的HQL查詢不更新Lucene索引

Session session = factory.getCurrentSession(); 
Query q = session.createQuery("delete from Charges cg where cg.id in (:charges)"); 
q.setParameterList("charges", chargeIds); 
int result = q.executeUpdate();` 

我在想什麼?我需要做些什麼來解決問題?

我創建了一個PostDeleteEvent,hoever的FullTextEventListener似乎沒有被接收事件:

SessionImpl sessImpl = (SessionImpl) factory.getCurrentSession(); 
SessionImplementor implementor = sessImpl.getPersistenceContext().getSession(); 
EntityPersister persister = implementor.getEntityPersister("Charges", cg); 
EntityEntry entry = sessImpl.getPersistenceContext().getEntry(cg); 

Object[] deletedState = new Object[] 
{ cg}; 
entry.setDeletedState(deletedState); 
PostDeleteEvent pdEvent = new PostDeleteEvent(entry, entry.getId(), deletedState, 
        entry.getPersister(), (EventSource) sessImpl);` 

謝謝。

回答

1

這是預期的限制,在休眠搜索參考記錄。

HQL更新語句被解釋爲

  • 生成的SQL批處理執行該操作
  • 無效任何相關的緩存(如果使用任何二級緩存)
  • 看看掛起操作需要被刷新到數據庫執行查詢之前

但它不會從數據庫加載所有可能的匹配內存!這會殺死性能。

仍然Lucene需要內存中的元素,所以這確實是一個設計限制,並且是預期的:您不應該對索引類型運行大規模更新語句,而是在內存中對它們進行迭代並對實體應用更改循環。

加載所有實體將是緩慢的,因爲它需要兌現內存中的所有數據,但是這需要反正養活Lucene的;一個好的二級緩存配置通常可以實現這一技巧,或者只需啓動MassIndexer就可以在所有變化都很大的情況下重新同步它。