Может ли org.springframework.data.repository быть управляемым Hibernate? - PullRequest
0 голосов
/ 14 февраля 2020

Я использую Hibernate Search для запроса записей в базе данных. В большинстве моих случаев я использую задание cron, которое создает мой индекс, но для одного конкретного случая c мне нужно, чтобы индекс обновлялся немедленно при изменении сущности. Я заметил, что хотя springframework.data.repository правильно обновляет данные в базе данных, Hibernate не выполняет обновление соответствующей сущности в индексе.

Когда я изменяю свою реализацию на используйте менеджер сущностей для этой транзакции (используя entitymanager.persist (x) et c ...), он также корректно обновляет индекс.

Мне нравится простота репозитория crud и я хотел бы оставаться последовательным, так есть ли способ сообщить hibernate об этом изменении, используя хранилище crud?

1 Ответ

1 голос
/ 17 февраля 2020

Spring Data предлагает репозиторий CRUD на основе JPA , который будет использовать JPA (Hibernate ORM) для выполнения операций CRUD и, таким образом, позволит Hibernate Search автоматически обновлять индексы. Вам не нужно реализовывать вызовы к entityManager.persist(), et c. себя.

Если в вашем хранилище CRUD не используется JPA (Hibernate ORM), то, конечно, (как вы заметили) Hibernate Search не будет знать об изменениях и не будет обновлять индексы.

Вы не указали, как именно был реализован ваш репозиторий CRUD, поэтому я полагаю, вы используете реализацию Spring Data JDB C? Это единственный известный мне способ, который позволит вам обновлять базу данных в Spring Data, не полагаясь на JPA (Hibernate ORM).

Я бы порекомендовал перейти на реализацию JPA Spring Data, по крайней мере, для объекта, который требует automati c, индексация на лету.

Если это действительно не вариант, я полагаю, вы можете каким-то образом подключиться к Spring Data JDB C (переопределение методов CRUD или использование прослушивателей событий возможно), так что каждый раз, когда объект изменяется:

  • вы загружаете его, используя Hibernate ORM
  • , вы явно индексируете его, используя fullTextSession.index () (в случае создания / обновления) или удаления его из индекса с помощью fullTextSession.purge () (в случае удаления).

Я сомневаюсь, что производительность будет очень хорошей , Однако. В частности, вы упустите некоторые оптимизации в Hibernate Search, которые позволяют избежать переиндексации, когда изменение касается только свойств, которые не проиндексированы.

...