Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在OpenLiberty上使用Hibernate Envers设置自定义修订信息_Java_Hibernate_Jpa_Hibernate Envers_Open Liberty - Fatal编程技术网

Java 在OpenLiberty上使用Hibernate Envers设置自定义修订信息

Java 在OpenLiberty上使用Hibernate Envers设置自定义修订信息,java,hibernate,jpa,hibernate-envers,open-liberty,Java,Hibernate,Jpa,Hibernate Envers,Open Liberty,我们正在将一个应用程序从JEE7迁移到JEE8。 此应用程序依赖于Hibernate ORM和Hibernate Envers。在JEE7上是版本5.2.17,在JEE8上,现在两个自由党的版本都是5.4.3。 我们有一个自定义修订实体,它通过实现RevisionListener添加用户信息来扩展DefaultRevisionEntity。 在JEE7上,它在OpenLiberty 19.0.0.5上运行良好,而在JEE8和Hibernate 5.4.3上,我们会遇到错误。在JEE8和Hiber

我们正在将一个应用程序从JEE7迁移到JEE8。 此应用程序依赖于Hibernate ORM和Hibernate Envers。在JEE7上是版本5.2.17,在JEE8上,现在两个自由党的版本都是5.4.3。 我们有一个自定义修订实体,它通过实现RevisionListener添加用户信息来扩展DefaultRevisionEntity。 在JEE7上,它在OpenLiberty 19.0.0.5上运行良好,而在JEE8和Hibernate 5.4.3上,我们会遇到错误。在JEE8和Hibernate 5.4.3上,现在可以在revisionlisteners上使用CDI功能。(). 在OpenLiberty上,当没有bean管理器准备好使用时,revisionlistener初始化以某种方式完成,如下面的堆栈跟踪所示:

Caused by: java.lang.IllegalStateException: org.hibernate.resource.beans.container.internal.NotYetReadyException: CDI BeanManager not (yet) ready to use
[INFO]  at org.hibernate.resource.beans.container.internal.JpaCompliantLifecycleStrategy$BeanImpl.initialize(JpaCompliantLifecycleStrategy.java:112)
[INFO]  at org.hibernate.resource.beans.container.internal.CdiBeanContainerExtendedAccessImpl$BeanImpl.initialize(CdiBeanContainerExtendedAccessImpl.java:113)
[INFO]  at org.hibernate.resource.beans.container.internal.CdiBeanContainerExtendedAccessImpl$BeanImpl.getBeanInstance(CdiBeanContainerExtendedAccessImpl.java:119)
[INFO]  at org.hibernate.resource.beans.internal.ManagedBeanRegistryImpl$ContainedBeanManagedBeanAdapter.getBeanInstance(ManagedBeanRegistryImpl.java:139)
[INFO]  at org.hibernate.envers.internal.revisioninfo.DefaultRevisionInfoGenerator.generate(DefaultRevisionInfoGenerator.java:77)
[INFO]  at org.hibernate.envers.internal.synchronization.AuditProcess.getCurrentRevisionData(AuditProcess.java:133)
[INFO]  at org.hibernate.envers.internal.synchronization.AuditProcess.executeInSession(AuditProcess.java:115)
[INFO]  at org.hibernate.envers.internal.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:174)
[INFO]  at org.hibernate.envers.internal.synchronization.AuditProcessManager$1.doBeforeTransactionCompletion(AuditProcessManager.java:47)
[INFO]  at org.hibernate.engine.spi.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:954)
[INFO]  ... 20 more
[INFO] Caused by: org.hibernate.resource.beans.container.internal.NotYetReadyException: CDI BeanManager not (yet) ready to use
[INFO]  ... 31 more
[INFO] Caused by: java.lang.NullPointerException
[INFO]  at org.hibernate.resource.beans.container.internal.JpaCompliantLifecycleStrategy$BeanImpl.initialize(JpaCompliantLifecycleStrategy.java:109)
[INFO]  ... 29 more
我发现这段对话可能指向同一个方向

实际上,这是我们在server.xml中设置的功能

<featureManager>
    <feature>jaxrs-2.1</feature> 
    <feature>jsonp-1.1</feature>
    <feature>cdi-2.0</feature>
    <feature>jpaContainer-2.2</feature>
    <feature>ejbLite-3.2</feature>
    <feature>mpMetrics-1.1</feature>
    <feature>mpHealth-1.0</feature>
    <feature>mpConfig-1.3</feature>
    <feature>servlet-4.0</feature>
</featureManager>

jaxrs-2.1
jsonp-1.1
cdi-2.0
JPA容器-2.2
ejbLite-3.2
mpMetrics-1.1
mpHealth-1.0
mpConfig-1.3
servlet-4.0
如果你需要更多的信息,我会提供给你。 这是一个已知的问题吗?如果您能为这个问题提供提示或解决方案,我将不胜感激


非常感谢。

是的,从我从Hibernate和IBM收到的回复来看,这似乎是一个已知的问题,正如我在论坛中提到的,在非常有用的Hibernate团队的指导下,我能够为这个问题制定一个解决方案

解决方法是实现
org.hibernate.search.hcore.spi.EnvironmentSynchronizer
以控制JPA初始化何时可以安全地继续,以及
javax.enterprise.inject.spi.Extension
以检测CDI何时准备好了
BeanManager

我在
org.hibernate.service.spi.ServiceContributor
interface中注册了我的EnvironmentSynchronizer实现。在EnvironmentSynchronizer内部,
WhenEnvironmentEntrady
事件方法传入一个
Runnable
,它表示负责JPA初始化的任务。这需要推迟到CDI完成bean发现,并且
BeanManager
准备就绪之后

我的CDI扩展实现等待
AfterBeanDiscovery
事件方法,这是允许先前延迟的JPA初始化任务成功继续的正确时间

在我准备好解决方案后,我开始与IBM支持部门沟通,以提高对兼容性问题的认识,并查看是否可以在将来的版本中将Hibernate初始化的细粒度控制内置到WebSphereLiberty中。IBM已经表示,他们希望Hibernate与WebSphere一起开箱即用,这非常棒,因此我希望在不久的将来,我们将在WebSphereLiberty中看到对Hibernate最新版本的全面支持

更新:我刚刚确认,不幸的是,我们的EnvironmentSynchronizer实现没有推迟Envers初始化。Envers初始化在WebSphere中启动时仍然会崩溃,我们的解决方案已经就绪

我将更新我们与IBM的案例,以包括Envers,并在Hibernate论坛的线程中添加注释,以查看是否有任何即时选项可用

更新:这是我用Hibernate Envers和自定义修订侦听器测试的解决方案。将此添加到persistence.xml将允许WebSphere成功启动:

<property name="hibernate.delay_cdi_access" value="true"/>

Steve Ebersole的评论:

这个选项(2)本质上告诉Hibernate延迟访问BeanManager,直到它在运行时第一次需要访问BeanManager为止。换句话说,第一次执行需要特定CDIBeanHibernate的操作时,将向BeanManager请求。这有一个严重的缺点,即如果bean不存在,您将在运行时之前不知道这一点,可以想象,在部署几个月之后


我们可能会在短期内使用此选项,目的是在IBM WebSphere完全支持最新版本的Hibernate开箱即用后将其删除。

非常感谢您@bustitech的努力。上面提到的NPE问题是通过使用RevisionListener发生的。如果您的EnvironmentSynchronizer和cdi acces delay的实现在版本编写时起作用,您是否可以进行测试?@skedi I可以确认WebSphere 19.0.0.4成功初始化了Hibernate 5.4.1,当使用我们的EnvironmentSynchronizer和CDI access delay active时,Hibernate Search 5.11.1和Hibernate Envers将使用自定义修订侦听器。正确审核数据库更改,并且不会引发异常。然而,即使使用我们的EnvironmentSynchronizer,WebSphere19.0.0.5在Hibernate搜索的初始化过程中也会崩溃,因此该版本中的CDI行为似乎出现了严重的倒退。我已将这些测试结果添加到IBM支持的开放案例中。