【问题标题】:Hibernate Search and Criteria Builder UpdateHibernate Search 和 Criteria Builder 更新
【发布时间】:2019-12-06 02:56:06
【问题描述】:

我在休眠搜索中遇到问题,因为当我使用条件生成器 1 逐个更新字段而不使用其类时,它不会在休眠搜索中更新其索引,您能告诉我为什么会发生这种情况吗?谢谢。

val builder: CriteriaBuilder = entityManager.criteriaBuilder
val criteria: CriteriaUpdate<Profile> = builder.createCriteriaUpdate(Profile::class.java)
val root: Root<Profile> = criteria.from(Profile::class.java)

fname?.let { criteria.set(root.get("firstName"), it) }
lname?.let { criteria.set(root.get("lastName"), it) }
birthdate?.let { criteria.set(root.get("birthDate"), it) }
mname?.let { criteria.set(root.get("middleName"), it) }

criteria.set(root.get("updatedBy"), uid)
   .where(builder.equal(root.get<String>("user").get<String>("id"), uid))
entityManager.createQuery(criteria).executeUpdate()

【问题讨论】:

    标签: hibernate spring-boot hibernate-search


    【解决方案1】:

    Hibernate Search 的自动重新索引功能基于 Hibernate ORM 事件。当您使用其 POJO 表示和 Session 方法(session.persist、session.delete...)直接创建/更新/删除实体时,这些事件由 Hibernate ORM 在内部触发。

    当您使用条件更新/删除查询时,您的查询将被转换为 SQL 并直接发送到数据库。这意味着 Hibernate ORM 将不知道哪些实体已准确更改,因此它不会发送与这些更改相关的内部事件。因此,Hibernate Search 根本不会意识到这些变化,也无法重新索引实体。

    在 Hibernate Search 6(目前处于 Beta 阶段)的文档中有对此限制的解释:https://docs.jboss.org/hibernate/search/6.0/reference/en-US/html_single/#mapper-orm-indexing-automatic-concepts

    有两种解决方法:

    1. 将实体加载到会话中以更改它们。仅当需要更改的实体很少时才有意义。
    2. 正如您在自己的回答中提到的,事后使用FullTextSession.index 触发实体的重新索引。

    【讨论】:

      【解决方案2】:

      我使用此命令使用 force re(indexing) 解决了我的问题。但如果您有任何好的建议或其他解决方案,我很乐意感谢。

      Search.getFullTextEntityManager(entityManager).index(getProfile(uid))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-01
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多