Hibernate HQL-запрос не обновляет индекс Lucene - PullRequest
2 голосов
/ 21 сентября 2011

Я использую Hibernate 3.6.3 Final и Hibernate Search 3.4.1.Я написал запрос на удаление HQL.Объекты удаляются из базы данных, но не удаляются из индекса Lucene после завершения транзакции.Вот запрос:

Session session = factory.getCurrentSession();
Query q = session.createQuery("delete from Charges cg where cg.id in (:charges)");
q.setParameterList("charges", chargeIds);
int result = q.executeUpdate();`

Чего мне не хватает?Что мне нужно сделать, чтобы решить проблему?

Я создал PostDeleteEvent, однако FullTextEventListener не получает событие:

 SessionImpl sessImpl = (SessionImpl) factory.getCurrentSession();
 SessionImplementor implementor = sessImpl.getPersistenceContext().getSession();
 EntityPersister persister = implementor.getEntityPersister("Charges", cg);
 EntityEntry entry = sessImpl.getPersistenceContext().getEntry(cg);

 Object[] deletedState = new Object[]
 { cg};
 entry.setDeletedState(deletedState);
 PostDeleteEvent pdEvent = new PostDeleteEvent(entry, entry.getId(), deletedState,
                    entry.getPersister(), (EventSource) sessImpl);`

Спасибо.

1 Ответ

1 голос
/ 06 октября 2012

Это ожидаемое ограничение, задокументированное в справочнике Hibernate Search.

Операторы обновления HQL интерпретируются как

  • Генерация пакетного SQL для выполнения операции
  • Признать недействительным любой соответствующий кеш (если используется кеш второго уровня)
  • Проверьте, нужно ли сбрасывать ожидающие операции в базу данных перед выполнением запроса

Но он не собирается загружать все потенциальные совпадения в памяти из базы данных! Это убило бы производительность.

Тем не менее, Lucene требует элементы в памяти, так что, действительно, это ограничение дизайна и ожидается: вы не должны запускать операторы массового обновления для индексированных типов, а скорее выполнять итерации по ним в памяти и применять изменения к объектам в цикле .

Загрузка всех объектов будет медленной, так как потребуется материализовать все данные в памяти, но это все равно необходимо для подачи Lucene; Хорошая конфигурация кэша второго уровня обычно делает свое дело, или просто запустите MassIndexer для повторной синхронизации всего, если изменения огромны.

...