0

たとえば、WAR モジュール、いくつかの EJB モジュール、およびいくつかの JARS を含む EAR があります。

EAR
 - moduleEjb.jar
 - moduleWeb.war
 -lib
      - entity.jar
      - resource.jar

ejb モジュールが環境から独立しているように、resource.jar の永続ユニットを使用したい (PU 名のみを覚えておく必要があります。moduleEjb.jar を変更せずに resource.jar のデータソースの jndi を変更できます)。見つかりません。

エンティティは 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 モジュール内で使用すると、動作します

4

1 に答える 1

2

ジャーを投稿したディレクトリ構造によるとentity.jarresource.jar同じディレクトリにあります: lib. したがって、ファイルのjar-fileエントリは次のようにpersistence.xmlなります。

<jar-file>entity.jar</jar-file>

代わりに

<jar-file>../entity.jar</jar-file>

ear ファイルのディレクトリに永続化アーカイブ (ディレクトリのpersistence.xml下に含まれる jar META-INF) がある場合、永続化ユニットは ear 内のすべてのコンポーネントに表示されます。そして、これはわずかに変更されたディレクトリ レイアウトです。libmyPU

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

関連資料:第 8 章: JPA 2.1 仕様のエンティティ パッケージ化。

于 2016-10-13T20:57:56.850 に答える