【发布时间】: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