2017-09-01 45 views
0

升級Hibernate Search的4.3.0.Final到5.7.0.Final和電流休眠版本後是5.2.6.Finalupgariding Hibernate Search的4.3到5.7.0文本搜索後沒有工作

我得到了以下異常

Caused by: org.hibernate.search.exception.AssertionFailure: An entity got loaded even though it was not part of the EntityInfo list 
    at org.hibernate.search.query.hibernate.impl.CriteriaObjectInitializer.initializeObjects(CriteriaObjectInitializer.java:98) 
    at org.hibernate.search.query.hibernate.impl.QueryLoader.executeLoad(QueryLoader.java:88) 
    at org.hibernate.search.query.hibernate.impl.AbstractLoader.load(AbstractLoader.java:58) 
    at org.hibernate.search.query.hibernate.impl.FullTextQueryImpl.list(FullTextQueryImpl.java:207) 
    at com.anite.bof2.component.textsearch.impl.TextSearcher.runQuery(TextSearcher.java:50) 
    at com.anite.bof2.component.textsearch.impl.DefaultLuceneTextSearch.performInclusiveTextSearch_aroundBody0(DefaultLuceneTextSearch.java:72) 
    at com.anite.bof2.component.textsearch.impl.DefaultLuceneTextSearch$AjcClosure1.run(DefaultLuceneTextSearch.java:1) 
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:66) 
    at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:72) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) 
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:70) 
    at com.anite.bof2.component.textsearch.impl.DefaultLuceneTextSearch.performInclusiveTextSearch(DefaultLuceneTextSearch.java:32) 
    at com.anite.bof2.modules.actions.query.SearchTextAction.update(SearchTextAction.java:285) 
    at com.anite.bof2.modules.actions.BaseBof2PenguinAction.doPerform(BaseBof2PenguinAction.java:31) 
    at org.apache.turbine.modules.actions.VelocityAction.doPerform(VelocityAction.java:99) 
    at org.apache.turbine.util.velocity.VelocityActionEvent.perform(VelocityActionEvent.java:177) 
    at org.apache.turbine.modules.actions.VelocityAction.perform(VelocityAction.java:187) 
    at org.apache.turbine.modules.actions.VelocitySecureAction.perform(VelocitySecureAction.java:133) 
    at org.apache.turbine.modules.ActionLoader.exec(ActionLoader.java:148) 
    at org.apache.turbine.modules.pages.DefaultPage.doBuild(DefaultPage.java:215) 
    at org.apache.turbine.modules.Page.build(Page.java:125) 
    at org.apache.turbine.modules.PageLoader.exec(PageLoader.java:151) 
    at org.apache.turbine.pipeline.ExecutePageValve.executePage(ExecutePageValve.java:158) 
    at org.apache.turbine.pipeline.ExecutePageValve.invoke(ExecutePageValve.java:101) 
    ... 48 more 

下面是代碼塊這給異常

@Transactional(readOnly = true) 
public <T> TextResults<T> performExclusionTextSearch(TextArgs<T> args) 
{ 
    if (args != null && args.getSearchText() != null && args.getFromDate() != null && args.getToDate() != null 
      && args.getFields() != null) 
    { 
     FullTextSession fullTextSession = Search.getFullTextSession(sessionFactory.getCurrentSession()); 
     QueryBuilder qb = getQueryBuilder(fullTextSession, args.getSearchEntity()); 

     try 
     { 
      // exclusion query 
      Query query = qb 
        .bool() 
        .must(qb.keyword().onFields(args.getFields()).matching(args.getSearchText()).createQuery()) 
        .not() 
        .must(qb.range().onField("captureDate").from(args.getFromDate()).to(args.getToDate()) 
          .createQuery()).createQuery(); 

      FullTextQuery textQuery = fullTextSession.createFullTextQuery(query, args.getSearchEntity()); 

      // apply any filter 
      if (args.getFilter() != null) 
      { 
       textQuery.enableFullTextFilter(args.getFilterClass()).setParameter(args.getFilterField(), 
         args.getFilter()); 
      } 

      return runQuery(textQuery, args.getLimit()); 
     } 
     catch (EmptyQueryException e) 
     { 
      // lucene standardanalyser filtered out the query word - ignore 
     } 
     return new TextResults<T>(false, new ArrayList<T>(0)); 
    } 
    else 
    { 
     ManagementContext.logErrorEvent("Null parameters passed to text search"); 
     return new TextResults<T>(false, new ArrayList<T>(0)); 
    } 
} 

protected <T> TextResults<T> runQuery(FullTextQuery query, int limit) 
{  
    boolean moreDataAvailable = false; 

    //apply capturedate as a sorted field 
    Sort sort = new Sort(new SortField("captureDate", SortField.Type.LONG, true)); 
    query.setSort(sort); 

    int resultsize = query.getResultSize(); 

    if(resultsize > limit) 
    { 
     //return marker to indicate more results available 
     moreDataAvailable = true; 
     query.setMaxResults(limit); 
    } 

    @SuppressWarnings("unchecked") 
    List<T> data = query.getResultList(); 

    TextResults<T> results = new TextResults<>(moreDataAvailable, data); 

    return results; 
} 

我在runQuery方法下執行時,出現錯誤。

@SuppressWarnings("unchecked") 
List<T> data = query.getResultList(); 

我的數據庫的Oracle 11g。上面的代碼工作正常,並提供有效的輸出與Hibernate搜索4.3.0.Final。

回答

0

老實說,你從這樣一個古老的版本,我很驚訝你的應用程序甚至還有過去的啓動:)

兩件事情,你甚至試圖分析搜索相關的故障之前應該做的更新:

  • 確保您使用的是最新版本的Hibernate ORM。在這種情況下,它應該至少是ORM 5.2.3,並且我會推薦最新版本(5.2.10,因爲我在寫這個)。
  • reindex your database completely。自從4.3版本以來,Hibernate Search發生了很大的變化,所以你的舊索引不太可能與Hibernate Search 5.7一起工作。
+0

是的我使用的是最新的hibernate ORM jar也 5.2.6.Final \t \t 5.7.0.Final Akhil

+0

我們還創建了新的索引,它是一個全新的數據庫。奇怪的是 – Akhil

+0

。你正在做什麼特別與你的實體ID?或者您正在使用Hibernate Envers? –

0

雖然從4.3.0.Final到5.7.0.Final在升級過程中調查了類似的問題,發現了一個可能的原因斷言例外: -

org.hibernate.search.exception.AssertionFailure: An entity got loaded even though it was not part of the EntityInfo list 

的異常可能拋出當在搜索條件中使用的類別錯誤地重寫了它的equals()hashCode()方法來比較身份而不是價值時。這會導致Hibernate代碼的LinkedHashMap.put(key, value)方法無法找到它期望在映射中的臨時代理對象(它之前放置在那裏),因爲key將包含具有相同值的不同對象實例。