在Sping Boot 3项目中,我使用Hibernate search 6.1.8Final在Elasticserach后端进行数据索引。我添加了一个typeBinder桥来索引计算值。在计算方法中,我使用JPARepository在数据库上进行选择。我在修改对象时遇到了几次异常,但之后错误消失了,我不知道它是否是随机的。知道exception is not blocking for persistence in the database and updating index. exception text:org.springframework.transaction.TransactionSystemException:Could not commit JPA transaction] with root cause org.hibernate.search.util.common.SearchException:HSEARCH700060:无法在处理实体时触发实体处理。请确保不要更改实体获取器或用于索引,并避免任何可能触发实体处理的事件。特别是,在实体获取器和桥接器中必须避免Hibernate ORM刷新。
实际上,在更新一个索引对象后,正在进行的重新索引会被启动。异常是在调用Bridge时触发的,更准确地说是在调用repository时触发的。我想了解这个错误的原因,但我几乎没有发现这个问题。
谢谢你的帮忙。
2条答案
按热度按时间vatpfxk51#
例外是告诉你什么是错的:
特别是,在实体getter和桥中必须避免Hibernate ORM刷新。
很难说没有复制者,但我猜这是正在发生的:
您没有提供Map/桥接代码,甚至没有提供堆栈跟踪,因此我无法告诉您如何解决您的问题。
下面是一些关于为什么会发生第二次刷新的猜测(为什么会发生,因为Hibernate ORM已经触发了一次?):
xt0899hw2#
非常感谢您的回答。
我通过更仔细地查看hibsearch调用找到了解决方案。(这是一个简单的查找,不对数据库执行任何操作)调用了一个本地查询,并在那里执行了刷新。不再有问题了。2我认为这个请求是本地的,而hibserach将是这样的,它不知道它在做什么,它会自动启动一个刷新。当我转到一个HQL查询时,它有命令,它知道这只是一个get,所以它不会执行刷新?另一方面,我发现奇怪的是,在给定的时刻,错误是随机的。
谢谢