Java Hibernate ClassCastException隐式命名策略JPACompliantImpl

Java Hibernate ClassCastException隐式命名策略JPACompliantImpl,java,hibernate,jakarta-ee,wildfly,Java,Hibernate,Jakarta Ee,Wildfly,我们希望在应用服务器(Wildfly V16.0)上使用另一个Hibernate版本(5.2.18.Final,JPA2.1) 但我们得到了以下例外: {"WFLYCTL0080: Failed services" => {"jboss.persistenceunit.\"david-app.ear#examplePersistenceUnit\".__FIRST_PHASE__" => "java.lang.ClassCastException: class org.hiberna

我们希望在应用服务器(Wildfly V16.0)上使用另一个Hibernate版本(5.2.18.Final,JPA2.1) 但我们得到了以下例外:

{"WFLYCTL0080: Failed services" => {"jboss.persistenceunit.\"david-app.ear#examplePersistenceUnit\".__FIRST_PHASE__" => "java.lang.ClassCastException: class org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl cannot be cast to class org.hibernate.boot.model.naming.ImplicitNamingStrategy (org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl is in unnamed module of loader 'org.hibernate:5.2.18.Final@5.2.18.Final' @155c18e0; org.hibernate.boot.model.naming.ImplicitNamingStrategy is in unnamed module of loader 'org.hibernate@5.3.9.Final' @102121eb)
Caused by: java.lang.ClassCastException: class org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl cannot be cast to class org.hibernate.boot.model.naming.ImplicitNamingStrategy (org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl is in unnamed module of loader 'org.hibernate:5.2.18.Final@5.2.18.Final' @155c18e0; org.hibernate.boot.model.naming.ImplicitNamingStrategy is in unnamed module of loader 'org.hibernate@5.3.9.Final' @102121eb)"}}
它似乎试图同时加载2个hibernate版本,但应通过以下配置避免这种情况:

jboss-deployment-structure.xml(参考资料/META-INF):


persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
         http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">
         <persistence-unit name="examplePersistenceUnit" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>jdbc/CoreXADataSource</jta-data-source>
    <properties>
        <property name="jboss.as.jpa.providerModule" value="org.hibernate:5.2.18.Final"/>
        <property name="hibernate.show_sql" value="false"/>
        <property name="hibernate.order_inserts" value="true"/>
        <property name="hibernate.jdbc.wrap_result_sets" value="true"/>
    </properties>
</persistence-unit>

org.hibernate.jpa.HibernatePersistenceProvider
jdbc/corexadasource

Wildfly中的Hibernate module.xml(5.2.18.Final slot):

<?xml version="1.0" encoding="UTF-8"?>
<module name="org.hibernate:5.2.18.Final" xmlns="urn:jboss:module:1.8">
<resources>
    <resource-root path="hibernate-core-5.2.18.Final.jar"/>
    <resource-root path="hibernate-entitymanager-5.2.18.Final.jar"/>
    <resource-root path="hibernate-java8-5.2.18.Final.jar"/>
</resources>

<dependencies>
    <module name="com.fasterxml.classmate"/>
    <module name="javax.api"/>
    <module name="javax.annotation.api"/>
    <module name="javax.enterprise.api"/>
    <module name="javax.persistence.api"/>
    <module name="javax.transaction.api"/>
    <module name="javax.validation.api"/>
    <module name="javax.xml.bind.api"/>
    <module name="org.antlr"/>
    <module name="org.dom4j"/>
    <module name="org.javassist" export="true"/>
    <module name="org.jboss.as.jpa.spi"/>
    <module name="org.jboss.jandex"/>
    <module name="org.jboss.logging"/>
    <module name="org.jboss.vfs"/>
    <module name="org.hibernate.commons-annotations"/>
    <module name="org.hibernate.jipijapa-hibernate5" services="import"/>
    <module name="org.infinispan.hibernate-cache" services="import" optional="true"/>
</dependencies>


有人知道为什么Wildfly在部署EAR文件时仍试图加载默认的Hibernate版本5.3.9吗?

Hey@David,我在与envers相关的类中也遇到过类似的问题。您应该使用jboss/wildfly提供的更新的hibernate版本。这对您来说很容易,因为您只是将其从5.2.x升级到5.3.y。对我来说,我必须将它从hibernate 4升级到hibernate 5。我完全同意使用最新的hibernate版本的Wildfly。但是我们有一些依赖项(运行Websphere(WAS9)在只支持JPA 2.1的生产环境中,我可以建议您在可部署系统中捆绑hibernate JAR,而不是从模块中使用它。我尝试过,但它仍然并行加载Wildfly hibernate版本。它将并行加载Wildfly hibernate版本,但您的代码将引用jars pres在你的lib folderHey@David中,我在与envers相关的类中遇到了类似的问题。你应该使用jboss/wildfly提供的更新的hibernate版本。这对你来说很容易,因为你只是将它从5.2.x升级到5.3.y。对我来说,我必须将它从hibernate 4升级到hibernate 5。我完全同意使用最新的hibernate版本但是我们有一些适当的依赖项(运行Websphere(WAS9)在只支持JPA 2.1的生产环境中,我可以建议您在可部署系统中捆绑hibernate JAR,而不是从模块中使用它。我尝试过,但它仍然并行加载Wildfly hibernate版本。它将并行加载Wildfly hibernate版本,但您的代码将引用jars pres在你的lib文件夹中
<?xml version="1.0" encoding="UTF-8"?>
<module name="org.hibernate:5.2.18.Final" xmlns="urn:jboss:module:1.8">
<resources>
    <resource-root path="hibernate-core-5.2.18.Final.jar"/>
    <resource-root path="hibernate-entitymanager-5.2.18.Final.jar"/>
    <resource-root path="hibernate-java8-5.2.18.Final.jar"/>
</resources>

<dependencies>
    <module name="com.fasterxml.classmate"/>
    <module name="javax.api"/>
    <module name="javax.annotation.api"/>
    <module name="javax.enterprise.api"/>
    <module name="javax.persistence.api"/>
    <module name="javax.transaction.api"/>
    <module name="javax.validation.api"/>
    <module name="javax.xml.bind.api"/>
    <module name="org.antlr"/>
    <module name="org.dom4j"/>
    <module name="org.javassist" export="true"/>
    <module name="org.jboss.as.jpa.spi"/>
    <module name="org.jboss.jandex"/>
    <module name="org.jboss.logging"/>
    <module name="org.jboss.vfs"/>
    <module name="org.hibernate.commons-annotations"/>
    <module name="org.hibernate.jipijapa-hibernate5" services="import"/>
    <module name="org.infinispan.hibernate-cache" services="import" optional="true"/>
</dependencies>