EAR 中未知的实体,持久性单元在另一个 jar 中
Entity unknown in EAR with persistence unit in another jar
我有一个带有 WAR 模块、一些 EJB 模块和一些 JARS 的 EAR,例如:
EAR
- moduleEjb.jar
- moduleWeb.war
-lib
- entity.jar
- resource.jar
我想使用 resource.jar 中的持久性单元,因此 ejb 模块独立于环境(我必须只记住 PU 名称,我可以更改 resource.jar 中数据源的 jndi 而无需更改 moduleEjb.jar),但未找到实体。
实体位于entity.jar:
@Entity
@Table(name = "ttracciatikettle", indexes = {...})
@NamedQueries({...})
public class TTracciatoKettle extends EntityBaseGest implements Serializable { ... }
持久化单元在 resource.jar
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" 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">
<persistence-unit name="myPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:/jboss/datasource/mydata</jta-data-source>
<jar-file>../entity.jar</jar-file>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/>
<property name="eclipselink.logging.level" value="ALL"/>
<property name="eclipselink.logging.level.sql" value="ALL"/>
<property name="javax.persistence.sql-load-script-source" value="META-INF/defaultdata.sql"/>
</properties>
</persistence-unit>
实体管理器在 EJB 中的 moduleEjb.jar 中使用:
@PersistenceContext(unitName = "myPU")
private EntityManager em;
@Override
public TTracciatoKettle findByCodice(String codice) throws BadRequestException{
try{
//return this.em.createNamedQuery("TTracciatoKettle.findByCodice", entityClass)
return this.em.createQuery("SELECT t FROM TTracciatoKettle t WHERE t.codice = :codice", entityClass)
.setParameter("codice", codice)
.getSingleResult();
}catch(NoResultException ne){
return null;
}catch(NonUniqueResultException nure){
...
}
}
即使我使用命名查询或 jpql,我也会收到错误
[14, 30] 抽象模式类型 'TTracciatoKettle' 未知。
[39, 47] 状态字段路径 't.codice' 无法解析为有效类型。
持久化单元myPU启动,加载脚本调用成功。
如果我使用相同的 PU 但在 ejb 模块内,它可以工作
根据您发布的目录结构,jar entity.jar
和 resource.jar
在同一目录中:lib
。所以 persistence.xml
文件中的 jar-file
条目应该是:
<jar-file>entity.jar</jar-file>
而不是
<jar-file>../entity.jar</jar-file>
在 ear 文件的 lib
目录中使用持久性存档(META-INF
目录下包含 persistence.xml
的 jar),持久性单元 myPU
应该是可见的耳中的所有组件。这是一个稍微修改过的目录布局:
EAR
moduleEjb.jar
moduleWeb.war
lib
entity.jar
resource.jar
META-INF // in the root of the jar file
persistence.xml
相关阅读:Chapter 8: Entity Packaging of JPA 2.1 规范。
我有一个带有 WAR 模块、一些 EJB 模块和一些 JARS 的 EAR,例如:
EAR
- moduleEjb.jar
- moduleWeb.war
-lib
- entity.jar
- resource.jar
我想使用 resource.jar 中的持久性单元,因此 ejb 模块独立于环境(我必须只记住 PU 名称,我可以更改 resource.jar 中数据源的 jndi 而无需更改 moduleEjb.jar),但未找到实体。
实体位于entity.jar:
@Entity
@Table(name = "ttracciatikettle", indexes = {...})
@NamedQueries({...})
public class TTracciatoKettle extends EntityBaseGest implements Serializable { ... }
持久化单元在 resource.jar
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" 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">
<persistence-unit name="myPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:/jboss/datasource/mydata</jta-data-source>
<jar-file>../entity.jar</jar-file>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/>
<property name="eclipselink.logging.level" value="ALL"/>
<property name="eclipselink.logging.level.sql" value="ALL"/>
<property name="javax.persistence.sql-load-script-source" value="META-INF/defaultdata.sql"/>
</properties>
</persistence-unit>
实体管理器在 EJB 中的 moduleEjb.jar 中使用:
@PersistenceContext(unitName = "myPU")
private EntityManager em;
@Override
public TTracciatoKettle findByCodice(String codice) throws BadRequestException{
try{
//return this.em.createNamedQuery("TTracciatoKettle.findByCodice", entityClass)
return this.em.createQuery("SELECT t FROM TTracciatoKettle t WHERE t.codice = :codice", entityClass)
.setParameter("codice", codice)
.getSingleResult();
}catch(NoResultException ne){
return null;
}catch(NonUniqueResultException nure){
...
}
}
即使我使用命名查询或 jpql,我也会收到错误
[14, 30] 抽象模式类型 'TTracciatoKettle' 未知。
[39, 47] 状态字段路径 't.codice' 无法解析为有效类型。
持久化单元myPU启动,加载脚本调用成功。 如果我使用相同的 PU 但在 ejb 模块内,它可以工作
根据您发布的目录结构,jar entity.jar
和 resource.jar
在同一目录中:lib
。所以 persistence.xml
文件中的 jar-file
条目应该是:
<jar-file>entity.jar</jar-file>
而不是
<jar-file>../entity.jar</jar-file>
在 ear 文件的 lib
目录中使用持久性存档(META-INF
目录下包含 persistence.xml
的 jar),持久性单元 myPU
应该是可见的耳中的所有组件。这是一个稍微修改过的目录布局:
EAR
moduleEjb.jar
moduleWeb.war
lib
entity.jar
resource.jar
META-INF // in the root of the jar file
persistence.xml
相关阅读:Chapter 8: Entity Packaging of JPA 2.1 规范。