我一直在使用Hibernate Search来查询数据库条目。对于我的大多数情况,我使用 cron 作业来构建我的索引,但对于一个特定情况,我需要索引在实体更改时立即更新。我注意到虽然springframework.data.repository正确更新了数据库中的数据,但 Hibernate 不会执行索引中相应实体的更新。
当我更改我的实现以使用实体管理器进行此事务(使用entitymanager.persist(x)等...)时,它也会正确更新索引。
我喜欢 crud 存储库的简单性并且我想保持一致,那么有没有办法让 hibernate 使用 crud 存储库知道这个更改?
Spring Data 提供了一个基于 JPA 的 CRUD 存储库,它将依赖 JPA(Hibernate ORM)来执行 CRUD 操作,从而允许 Hibernate Search 自动更新索引。您不需要自己实现对entityManager.persist()
等的调用。
如果你的CRUD存储库并没有使用JPA(Hibernate的ORM),那当然(如你注意到)Hibernate Search的不会察觉的变化并不会更新索引。
您没有具体说明您的 CRUD 存储库是如何实现的,所以我想您正在使用Spring Data JDBC实现?这是我所知道的唯一一种允许您在不依赖 JPA(Hibernate ORM)的情况下在 Spring Data 中更新数据库的方法。
我建议至少对于需要自动、动态索引的实体切换到 Spring Data JPA 实现。
如果这真的不是一个选项,我想您可以以某种方式插入 Spring Data JDBC(覆盖 CRUD 方法,或者使用事件侦听器),以便每次更改实体时:
然而,我怀疑性能会非常好。特别是,当更改仅涉及未编入索引的属性时,您将错过 Hibernate Search 中的一些优化,这些优化可避免重新索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句