本文介绍了在将休眠搜索设置为4.3至5.7.0后,文本搜索不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

将Hibernate搜索从4.3.0.Final升级到5.7.0.最终和当前的Hibernate版本是5.2.6.Final

我遇到了例外情况

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;
}
@SuppressWarnings("unchecked")
List<T> data = query.getResultList();

我的数据库是Oracle 11g.上面的代码可以正常工作,并在Hibernate search 4.3.0.Final中给出有效的输出.

解决方案

在调查从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将包含具有相同值的不同对象实例. /p>

After upgrading Hibernate search 4.3.0.Final to 5.7.0.Final and current hibernate version is 5.2.6.Final

I got following exception

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

Below is the code block which gives exception

@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;
}
@SuppressWarnings("unchecked")
List<T> data = query.getResultList();

My database is Oracle 11g. Above code is working fine and gives valid output with Hibernate search 4.3.0.Final.

解决方案

Whilst investigating a similar issue during an upgrade from 4.3.0.Final to 5.7.0.Final, have found a possible cause for the assertion exception:-

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

The exception can be thrown when the class being used in the search criteria has incorrectly overridden its equals() and hashCode() methods to compare on identity rather than by value. This causes the Hibernate code's LinkedHashMap.put(key, value) method to fail to find the temporary proxy object that it expects to be in the map (that it had previously placed there) because the key will contain different object instances that have the same value.

这篇关于在将休眠搜索设置为4.3至5.7.0后,文本搜索不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-30 08:17