Да, из ответов, которые я получил от Hibernate и IBM, это кажется известной проблемой, и, как я уже упоминал на форуме, я смог разработать обходной путь для решения этой проблемы под руководством очень полезной команды Hibernate. .
Обходной путь должен был реализовать org.hibernate.search.hcore.spi.EnvironmentSynchronizer
для контроля, когда инициализация JPA может безопасно продолжаться, и javax.enterprise.inject.spi.Extension
, чтобы определить, когда CDI имеет BeanManager
готов.
Я регистрирую свою реализацию EnvironmentSynchronizer с org.hibernate.service.spi.ServiceContributor
интерфейсом. Внутри EnvironmentSynchronizer метод события whenEnvironmentReady
передает значение Runnable
, которое представляет задачу, отвечающую за инициализацию JPA. Это нужно отложить до тех пор, пока CDI не завершит обнаружение компонента, и BeanManager
будет готов.
Моя реализация расширения CDI ожидает метод события AfterBeanDiscovery
, который является подходящим временем для успешного продолжения отложенной задачи инициализации JPA.
После того, как мой обходной путь был на месте, я начал взаимодействовать с IBM Support, чтобы повысить осведомленность о проблеме совместимости и посмотреть, можно ли встроить этот детализированный элемент управления инициализацией Hibernate в WebSphere Liberty в будущем выпуске. IBM указала, что они хотели бы, чтобы Hibernate работал из коробки с WebSphere, что является фантастическим, поэтому я надеюсь, что мы увидим полную поддержку последней версии Hibernate в WebSphere Liberty в ближайшем будущем.
Обновление: Я только что подтвердил, что, к сожалению, наша реализация EnvironmentSynchronizer не откладывает инициализацию Envers. Инициализация Envers все еще дает сбой при запуске в WebSphere с нашим обходным решением.
Я обновлю наш случай с IBM, включив в него Envers, и добавлю примечание в ветку форума Hibernate, чтобы узнать, есть ли какие-либо доступные варианты.
Обновление: Вот решение, которое я протестировал с Hibernate Envers и пользовательским RevisionListener. Добавление этого файла в файл persistence.xml позволит успешно запустить WebSphere:
<property name="hibernate.delay_cdi_access" value="true"/>
Комментарии от Стива Эберсоле:
Этот параметр (2), по сути, указывает Hibernate отложить доступ к BeanManager до тех пор, пока он сначала не потребуется, во время выполнения. Другими словами, когда вы в первый раз выполняете операцию, для которой нужен определенный компонент CDI, Hibernate запросит об этом BeanManager. Это имеет серьезный недостаток в том, что если бин не существует, вы не узнаете об этом до времени выполнения, возможно, через несколько месяцев после развертывания.
Мы могли бы использовать эту опцию на короткий срок, чтобы удалить ее, как только IBM WebSphere полностью поддерживает последнюю версию Hibernate из коробки.