Что может быть причиной для этого
Предполагая, что код, который не удался, принадлежит вам, он по сути небезопасен:
- Он опирается на внутренний , класс не-API:
AbstractSessionImpl
. Эти классы не предназначены для доступа пользователей. - Он использует отражение для доступа к одному из своих частных полей:
factory
. Эти поля не предназначены для доступа пользователей.
Короче говоря, код, который не работает, скорее всего, просто взлом, и этот взлом больше не работает в последних версиях Hibernate ORM / Search.
Вы не предоставили полную трассировку стека, поэтому я не знаю, где находится код. Если код ваш, вы должны найти новый взломать. Я не могу помочь, не зная, что должен делать код. Если код находится в Hibernate ORM или Search, укажите полную трассировку стека.
Каковы рекомендуемые / совместимые Hibernate-search-orm и Lucene для hibernate 5.4.11 ??
Версии, которые вы используете, в порядке. Если вы хотите быть уверены, проверьте матрицу совместимости . Проблема заключается во взломе, как объяснено выше.
РЕДАКТИРОВАТЬ: Итак, это взлом. Вместо этого вы должны использовать SPI, насколько это возможно. Вместо этого:
Field factoryField = AbstractSessionImpl.class.getDeclaredField("factory");
factoryField.setAccessible(true);
SessionFactoryImpl factory = (SessionFactoryImpl) factoryField.get(getSessionFactory().getCurrentSession());
Field namedQueriesField = SessionFactoryImpl.class.getDeclaredField("namedQueryRepository");
namedQueriesField.setAccessible(true);
NamedQueryRepository namedQueryRepository = (NamedQueryRepository) namedQueriesField.get(factory);
Field namedQueryDefinitionMapField = NamedQueryRepository.class.getDeclaredField("namedQueryDefinitionMap");
namedQueryDefinitionMapField.setAccessible(true);
Map namedQueryDefinitionMap = (Map) namedQueryDefinitionMapField.get(namedQueryRepository);
Сделайте это:
NamedQueryRepository namedQueryRepository = getSessionFactory().unwrap(SessionFactoryImplementor.class)
.getNamedQueryRepository()
Field namedQueryDefinitionMapField = NamedQueryRepository.class.getDeclaredField("namedQueryDefinitionMap");
namedQueryDefinitionMapField.setAccessible(true);
Map namedQueryDefinitionMap = (Map) namedQueryDefinitionMapField.get(namedQueryRepository);
Вторая часть по-прежнему является хаком, по-прежнему fr agile и потенциально может сломаться в следующих версиях Hibernate ОРМ. Но, по крайней мере, пока это должно работать.