在多个应用程序之间共享的 JPA 实体(Wildfly - Hibernate - Maven)



有没有办法配置各种持久性.xml包含在不同的应用程序(战争或耳朵)中,这些应用程序都使用包含所有实体的共享 jar?

像这样:

deployments/
|-ArchiviBase.war
|-WEB-INFclassesMETA-INFpersistence.xml
|-WEB-INFclassesMETA-INFTipoAbitazione.hbm.xml
|-Application2.war
|-WEB-INFclassesMETA-INFpersistence.xml
|-Application3.war
|-WEB-INFclassesMETA-INFpersistence.xml
lib/
|-models.jar
|- ittestarchiviBasebeansTipoAbitazione.java

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

坚持不懈.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 实体将全部包含在共享模型.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 in service jboss.persistenceunit."archiviBaseTest2-0.0.1-SNAPSHOT.war#archiviBasePU": javax.persistence.PersistenceException: [PersistenceUnit: archiviBasePU] 无法构建 Hibernate SessionFactory at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:198) at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:128) at java.security.AccessController.doPrivileged(Native Method) at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:664) at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:213) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377) at java.lang.Thread.run(Thread.java:748) at org.jboss.threads.JBossThread.run(JBossThread.java:513) 由: javax.persistence.PersistenceException: [PersistenceUnit: archiviBasePU] 无法构建 Hibernate SessionFactory at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1327) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1253) at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:170) ...10 更多 原因:org.hibernate.MappingException:无法获取构造函数 org.hibernate.persister.entity.SingleTableEntityPersister at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:154) at org.hibernate.internal.SessionFactoryImpl.(会议工厂.java:295) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1250) ...12 更多 原因:org.hibernate.Hibernate异常:无法实例化默认图普利器 [org.hibernate.tuple.entity.PojoEntityTuplizer] at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:91) at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116) at org.hibernate.tuple.entity.EntityMetamodel.(实体元模型.java:413) at org.hibernate.persister.entity.AbstractEntityPersister.(摘要实体Persister.java:557) at org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:124) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) ...17 更多 原因: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:88) ...26 更多 原因: java.lang.IllegalArgumentException: 无法创建类型 at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:154) at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:365) at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:174) at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:376) at org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.load(ByteBuddyState.java:183) at org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.loadProxy(ByteBuddyState.java:107) at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyHelper.buildProxy(ByteBuddyProxyHelper.java:54) at org.hibernate.proxy.pojo.bytebuddy.ByteBuddyProxyFactory.postInstantiate(ByteBuddyProxyFactory.java:62) at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:103) at org.hibernate.tuple.entity.AbstractEntityTuplizer.(摘要实体图.java:155) at org.hibernate.tuple.entity.PojoEntityTuplizer.(PojoEntityTuplizer.java:51) ...31 更多 原因: java.lang.IllegalStateException: 调用 Unsafe::d efineClass 时出错 at net.bytebuddy.dynamic.load.ClassInjector$UsingUnsafe$Dispatcher$Enabled.defineClass(ClassInjector.java:1997) at net.bytebuddy.dynamic.load.ClassInjector$UsingUnsafe.injectRaw(ClassInjector.java:1774) at net.bytebuddy.dynamic.load.ClassInjector$AbstractBase.inject(ClassInjector.java:112) at net.bytebuddy.dynamic.load.ClassLoadStrategy$ForUnsafeInjection.load(ClassLoadStrategy.java:546) at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:100) at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:5662) at org.hibernate.bytecode.internal.bytebuddy.ByteBuddyState.lambda$load$0(ByteBuddyState.java:187) at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:152) ...41 更多 原因: java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy at sun.misc.Unsafe.defineClass(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at net.bytebuddy.dynamic.load.ClassInjector$UsingUnsafe$Dispatcher$Enabled.defineClass(ClassInjector.java:1987) ...48 更多 原因: java.lang.ClassNotFoundException: org.hibernate.proxy.HibernateProxy from [Module "deployment.external.global-directory.lib" from Service Module Loader] at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:255) at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:410) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116) ...还有 54 个

2021-03-25 15:20:46,411 错误 [org.jboss.as.controller.management-operation] (External Management 请求线程 -- 1) WFLYCTL0013:操作("添加")失败 - 地址: ([("deployment" => "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:无法实例化默认 tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] 由: java.lang.reflect.InvocationTargetException 导致:java.lang.IllegalArgumentException:无法创建类型 由以下原因引起:java.lang.IllegalStateException: 调用 Unsafe 时出错::d efineClass 原因:java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy 由: java.lang.ClassNotFoundException: org.hibernate.proxy.HibernateProxy from [Module "deployment.external.global-directory.lib" from Service Module 加载器]"}} 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:无法实例化默认 tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] 由: java.lang.reflect.InvocationTargetException 导致:java.lang.IllegalArgumentException:无法创建类型 由以下原因引起:java.lang.IllegalStateException: 调用 Unsafe 时出错::d efineClass 原因:java.lang.NoClassDefFoundError: org/hibernate/proxy/HibernateProxy 由: java.lang.ClassNotFoundException: org.hibernate.proxy.HibernateProxy from [Module "deployment.external.global-directory.lib" from Service Module Loader]"}}

<!-- Define persistence unit -->
<persistence-unit name="archiviBasePU">
...
<jar-file>models.jar</jar-file>
...
</persistence-unit>

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

最新更新