Hibernate search 6:使用Type bridge的随机错误

xienkqul  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(54)

在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时触发的。我想了解这个错误的原因,但我几乎没有发现这个问题。
谢谢你的帮忙。

vatpfxk5

vatpfxk51#

例外是告诉你什么是错的:
特别是,在实体getter和桥中必须避免Hibernate ORM刷新。
很难说没有复制者,但我猜这是正在发生的:

  • Hibernate ORM刷新会话
  • 这会触发Hibernate Search中的索引
  • 你的桥被处决了
  • 您的桥运行Hibernate ORM查询
  • 该查询触发会话的自动刷新;请参阅https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#_auto_flush_on_jpqlhql_query
  • 这会触发Hibernate Search中的索引
  • Hibernate Search检测到它并抛出异常,因为这不会有好结果。

您没有提供Map/桥接代码,甚至没有提供堆栈跟踪,因此我无法告诉您如何解决您的问题。
下面是一些关于为什么会发生第二次刷新的猜测(为什么会发生,因为Hibernate ORM已经触发了一次?):

  • 一个明显的问题是,如果你在你的桥中调用setter,但是你不这样做,对吗?这没有意义。
  • 也许您的Map使用了一些用户类型,这些用户类型阻止了Hibernate ORM确定刷新是必要的,因此Hibernate ORM总是刷新?
  • 也许在桥中运行查询不起作用。我们有一个测试,但老实说,这是非常基本的。我找不到你正在做的功能请求; https://hibernate.atlassian.net/browse/HSEARCH-1937很接近,但它是关于使用查询来检索索引依赖项的,所以可能不是你想要的。
xt0899hw

xt0899hw2#

非常感谢您的回答。
我通过更仔细地查看hibsearch调用找到了解决方案。(这是一个简单的查找,不对数据库执行任何操作)调用了一个本地查询,并在那里执行了刷新。不再有问题了。2我认为这个请求是本地的,而hibserach将是这样的,它不知道它在做什么,它会自动启动一个刷新。当我转到一个HQL查询时,它有命令,它知道这只是一个get,所以它不会执行刷新?另一方面,我发现奇怪的是,在给定的时刻,错误是随机的。
谢谢

相关问题