Я использую Hibernate Search 5.11 в своем приложении Spring Boot 2, что позволяет проводить полнотекстовые исследования.Это библиотека требует индексации документов.
Когда мое приложение запускается, я пытаюсь вручную переиндексировать данные индексируемой сущности (MyEntity.class) каждые пять минут (по конкретной причине, из-за контекста моего сервера).
Я пытаюсь проиндексировать данные MyEntity.class.
MyEntity.class имеет свойство attachFiles, которое представляет собой хэш-набор, заполненный объединением @OneToMany (), с режимом отложенной загрузкиenabled:
@OneToMany(mappedBy = "myEntity", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<AttachedFile> attachedFiles = new HashSet<>();
Я кодирую требуемый процесс индексации, но возникает исключение для " fullTextSession.index (result); ", когда свойство attachFiles данного объекта заполнено однимили более элементов:
org.hibernate.TransientObjectException: The instance was not associated with this session
Режим отладки указывает на сообщение типа «Невозможно загрузить [...]» для значения хэш-значения сущности в этом случае.
И если HashSet пуст(не ноль, только пусто), исключение не выдается.
Мой метод индексации:
private void indexDocumentsByEntityIds(List<Long> ids) {
final int BATCH_SIZE = 128;
Session session = entityManager.unwrap(Session.class);
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.setFlushMode(FlushMode.MANUAL);
fullTextSession.setCacheMode(CacheMode.IGNORE);
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<MyEntity> criteria = builder.createQuery(MyEntity.class);
Root<MyEntity> root = criteria.from(MyEntity.class);
criteria.select(root).where(root.get("id").in(ids));
TypedQuery<MyEntity> query = fullTextSession.createQuery(criteria);
List<MyEntity> results = query.getResultList();
int index = 0;
for (MyEntity result : results) {
index++;
try {
fullTextSession.index(result); //index each element
if (index % BATCH_SIZE == 0 || index == ids.size()) {
fullTextSession.flushToIndexes(); //apply changes to indexes
fullTextSession.clear(); //free memory since the queue is processed
}
} catch (TransientObjectException toEx) {
LOGGER.info(toEx.getMessage());
throw toEx;
}
}
}
У кого-нибудь есть идея?
Спасибо!