问题描述
将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后,文本搜索不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!