【问题标题】:JPA Entities shared between several applications (Wildfly - Hibernate - Maven)JPA 实体在多个应用程序之间共享(Wildfly - Hibernate - Maven)
【发布时间】:2021-06-22 10:11:03
【问题描述】:

有没有办法配置包含在不同应用程序(war 或 ear)中的各种 persistence.xml,它们都使用包含所有实体的共享 jar?

类似:

  deployments/
    |-ArchiviBase.war
      |-WEB-INF\classes\META-INF\persistence.xml
      |-WEB-INF\classes\META-INF\TipoAbitazione.hbm.xml
    |-Application2.war
      |-WEB-INF\classes\META-INF\persistence.xml
    |-Application3.war
      |-WEB-INF\classes\META-INF\persistence.xml
  lib/
    |-models.jar
      |- it\test\archiviBase\beans\TipoAbitazione.java

对于战争中的所有文件(persistence.xml、hbm.xml 和 java 类),映射工作正常,但我需要与所有应用程序共享 java 实体,所以我想将它们移动到 models.jar。

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="archiviBasePU">
        <jta-data-source>java:jboss/jdbc/myDataSource</jta-data-source>
        <properties>
            <property name="jboss.entity.manager.factory.jndi.name"
                            value="java:jboss/hibernate/app1SF" />
            <property name="jboss.entity.manager.jndi.name"
                            value="java:/hibernate/app1SF" />
            <property name="hibernate.generate_statistics" value="true" />
            <property name="hibernate.default_schema"
                            value="app_schema" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

TipoAbitazione.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true"
    default-access="property" default-cascade="none" default-lazy="true">
    <class dynamic-insert="false" dynamic-update="false"
        mutable="true"
        name="it.test.app1.beans.TipoAbitazione"
        optimistic-lock="version" polymorphism="implicit"
        select-before-update="false" table="tipo_abitazione">
        <id column="tpab_codice" name="codice" type="java.lang.String">
            <generator class="assigned" />
        </id>
        <property column="tpab_descrizione" generated="never"
            lazy="false" length="100" name="descrizione" not-null="true"
            optimistic-lock="true" type="java.lang.String" unique="false" />
        <property column="tpab_flag_attivo" generated="never"
            lazy="false" length="1" name="attivo" optimistic-lock="true"
            type="java.lang.Boolean" unique="false" />
    </class>
</hibernate-mapping>

TipoAbitazione.java

package it.test.archiviBase.beans;

import java.io.Serializable;
 
public class TipoAbitazione implements Serializable {

    private static final long serialVersionUID = 1L;

    private String codice;
    private String descrizione;
    private Boolean attivo;

    public TipoAbitazione() {
    }

    public TipoAbitazione(String codice, String descrizione) {
        this.codice = codice;
        this.descrizione = descrizione;
    }

    public TipoAbitazione(String codice, String descrizione, Boolean attivo) {
        this.codice = codice;
        this.descrizione = descrizione;
        this.attivo = attivo;
    }

    public String getCodice() {
        return this.codice;
    }

    public void setCodice(String codice) {
        this.codice = codice;
    }

    public String getDescrizione() {
        return this.descrizione;
    }

    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    public Boolean getAttivo() {
        return this.attivo;
    }

    public void setAttivo(Boolean attivo) {
        this.attivo = attivo;
    }
}

每个应用程序都应该定义自己的持久化单元,使用自己的 hbm.xml 文件,但 java 实体将全部包含在共享的 models.jar 文件中

这是我尝试部署战争时的错误:

1-03-25 15:20:46,406 错误 [org.jboss.msc.service.fail] (ServerService 线程池 -- 3) MSC000001: 启动服务失败 jboss.persistenceunit.“archiviBaseTest2-0.0.1-SNAPSHOT.war#archiviBasePU”: 服务中的 org.jboss.msc.service.StartException jboss.persistenceunit.“archiviBaseTest2-0.0.1-SNAPSHOT.war#archiviBasePU”: javax.persistence.PersistenceException:[PersistenceUnit: archiviBasePU] 无法构建 Hibernate SessionFactory 在 org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:198) 在 org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:128) 在 java.security.AccessController.doPrivileged(本机方法) 在 org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:664) 在 org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:213) 在 org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) 在 org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990) 在 org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) 在 org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377) 在 java.lang.Thread.run(Thread.java:748) 在 org.jboss.threads.JBossThread.run(JBossThread.java:513) 引起:javax.persistence.PersistenceException: [PersistenceUnit: archiviBasePU] 无法构建 Hibernate SessionFactory 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1327) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1253) 在 org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) 在 org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:170) ... 10 更多原因:org.hibernate.MappingException:无法获取构造函数 org.hibernate.persister.entity.SingleTableEntityPersister 在 org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123) 在 org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) 在 org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:154) 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:295) 在 org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1250) ... 12 更多原因:org.hibernate.HibernateException:无法实例化默认 tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] 在 org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:91) 在 org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116) 在 org.hibernate.tuple.entity.EntityMetamodel.(EntityMetamodel.java:413) 在 org.hibernate.persister.entity.AbstractEntityPersister.(AbstractEntityPersister.java:557) 在 org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:124) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) ... 17 更多原因:java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:88) ... 26 更多原因:java.lang.IllegalArgumentException:无法创建类型 在 net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:154) 在 net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:365) 在 net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:174) 在 net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:376) 在 org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.load(ByteBuddyState.java:183) 在 org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.loadProxy(ByteBuddyState.java:107) 在 org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyHelper.buildProxy(ByteBuddyProxyHelper.java:54) 在 org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyFactory.postInstantiate(ByteBuddyProxyFactory.java:62) 在 org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:103) 在 org.hibernate.tuple.entity.AbstractEntityTuplizer.(AbstractEntityTuplizer.java:155) 在 org.hibernate.tuple.entity.PojoEntityTuplizer.(PojoEntityTuplizer.java:51) ... 31 更多原因:java.lang.IllegalStateException: Error invoking Unsafe::defineClass 在 net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe$Dispatcher$Enabled.defineClass(ClassInjector.java:1997) 在 net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe.injectRaw(ClassInjector.java:1774) 在 net.bytebuddy.dynamic.loading.ClassInjector$AbstractBase.inject(ClassInjector.java:112) 在 net.bytebuddy.dynamic.loading.ClassLoadingStrategy$ForUnsafeInjection.load(ClassLoadingStrategy.java:546) 在 net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:100) 在 net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:5662) 在 org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.lambda$load$0(ByteBuddyState.java:187) 在 net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:152) ... 41 更多原因:java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy 在 sun.misc.Unsafe.defineClass(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 net.bytebuddy.dynamic.loading.ClassInjector$UsingUnsafe$Dispatcher$Enabled.defineClass(ClassInjector.java:1987) ... 48 更多原因:java.lang.ClassNotFoundException: org.hibernate.proxy.HibernateProxy 来自 [Module 来自服务模块加载器的“deployment.external.global-directory.lib”] 在 org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:255) 在 org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410) 在 org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) 在 org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116) ... 54 更多

2021-03-25 15:20:46,411 错误 [org.jboss.as.controller.management-operation](外部管理 请求线程 -- 1) WFLYCTL0013:操作(“添加”)失败 - 地址: ([("部署" => "archiviBaseTest2-0.0.1-SNAPSHOT.war")]) - 失败 描述:{“WFLYCTL0080:服务失败”=> {"jboss.persistenceunit."archiviBaseTest2-0.0.1-SNAPSHOT.war#archiviBasePU"" =>“javax.persistence.PersistenceException:[PersistenceUnit:archiviBasePU]无法构建Hibernate SessionFactory 引起:javax.persistence.PersistenceException:[PersistenceUnit:archiviBasePU] 无法构建 Hibernate 会话工厂 引起:org.hibernate.MappingException:无法获取构造函数 org.hibernate.persister.entity.SingleTableEntityPersister 引起:org.hibernate.HibernateException:无法实例化默认元组[org.hibernate.tuple.entity.PojoEntityTuplizer] 引起:java.lang.reflect.InvocationTargetException 引起:java.lang.IllegalArgumentException:无法创建类型 原因:java.lang.IllegalStateException:调用 Unsafe::defineClass 时出错 引起:java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy 引起:java.lang.ClassNotFoundException: org.hibernate.proxy.HibernateProxy from [Module 服务模块中的“deployment.external.global-directory.lib” 加载程序]"}} 2021-03-25 15:20:46,412 错误 [org.jboss.as.server] (外部管理请求线程——1)WFLYSRV0021:部署 部署“archiviBaseTest2-0.0.1-SNAPSHOT.war”被回滚 以下失败消息:{“WFLYCTL0080:失败的服务”=> {"jboss.persistenceunit."archiviBaseTest2-0.0.1-SNAPSHOT.war#archiviBasePU"" =>“javax.persistence.PersistenceException:[PersistenceUnit:archiviBasePU]无法构建Hibernate SessionFactory 引起:javax.persistence.PersistenceException:[PersistenceUnit:archiviBasePU] 无法构建 Hibernate 会话工厂 引起:org.hibernate.MappingException:无法获取构造函数 org.hibernate.persister.entity.SingleTableEntityPersister 引起:org.hibernate.HibernateException:无法实例化默认元组[org.hibernate.tuple.entity.PojoEntityTuplizer] 引起:java.lang.reflect.InvocationTargetException 引起:java.lang.IllegalArgumentException:无法创建类型 原因:java.lang.IllegalStateException:调用 Unsafe::defineClass 时出错 引起:java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy 引起:java.lang.ClassNotFoundException: org.hibernate.proxy.HibernateProxy from [Module 服务模块中的“deployment.external.global-directory.lib” 加载器]"}}

【问题讨论】:

    标签: java hibernate jpa wildfly


    【解决方案1】:
    <!-- Define persistence unit -->
    <persistence-unit name="archiviBasePU">
        ...
        <jar-file>models.jar</jar-file>
        ...
    </persistence-unit>
    

    【讨论】:

    • 我已经尝试过使用 jar-file 标签,我认为这是正确的方法,但我得到了同样的错误。还有其他想法吗?
    • 错误似乎与此无关。不是java.lang.ClassNotFoundException: org.hibernate.proxy.HibernateProxy吗?这意味着类路径中缺少 hibernate-core
    • 我想使用Wildfly提供的Hibernate版本。为什么如果我把所有的文件都放在战争中,一切都正确加载了吗?如何将 hibernate-core 添加到 models.jar?
    【解决方案2】:

    如果您不想在每个应用程序的 persistence.xml 中显式列出 persistence.xml,则必须将它们与加载的类放在同一个库中。

    【讨论】:

    • 如果我在persistence.xml 中明确列出带有&lt;class&gt;it.test.app1.beans.TipoAbitazione&lt;/class&gt; 的类,我得到了同样的错误:java.lang.ClassNotFoundException: org.hibernate.proxy.HibernateProxy from [Module \"deployment.external.global-directory.lib\" from Service Module Loader]"}}。我使用的是 WildFly 提供的 Hibernate。
    猜你喜欢
    • 2018-01-29
    • 1970-01-01
    • 2017-07-08
    • 2013-06-25
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2017-06-15
    • 2020-07-26
    相关资源
    最近更新 更多