【问题标题】:Entity unknown in EAR with persistence unit in another jarEAR 中未知的实体,在另一个 jar 中具有持久性单元
【发布时间】:2017-02-22 07:09:40
【问题描述】:

我有一个带有 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启动,加载脚本调用成功。 如果我在 ejb 模块中使用相同的 PU,它可以工作

【问题讨论】:

  • 你试过 `@PersistenceContext(unitName = "lib/resoure.jar#myPU") 吗?
  • @ujulu 我刚试过,结果一样:(

标签: java maven jpa ear persistence-unit


【解决方案1】:

根据您发布的目录结构,entity.jarresource.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中的所有组件可见。这是一个稍微修改的目录布局:

EAR
   moduleEjb.jar
   moduleWeb.war
   lib
      entity.jar
      resource.jar
          META-INF  // in the root of the jar file
              persistence.xml

相关阅读:JPA 2.1 规范的Chapter 8: Entity Packaging

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2012-05-25
    • 2011-07-16
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多