persistence.xmlは次のようになります。
<persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>jdbc/test</non-jta-data-source>
<jar-file>../../lib/app-services-1.0.jar</jar-file>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
これはWebプロジェクトなので、デプロイメントユニットはwarファイルです。参照しようとしたjarファイルはWEB-INF/lib /フォルダーにありますpersistence.xmlWEB-INF/classes/META-INFフォルダーにあります。展開されているとき、それは単に私に伝えます
「警告:ファイルが見つかりません(無視されます):file:.../../lib/app-services-1.0.jar」。
また、考えられるすべての可能なパス、つまり../ lib/app-services-1.0.jar、lib/app-services-も試しました1.0.jar。
これを行う正しい道は何ですか?
誰かがこれに遭遇した場合に備えて:jar-file-statementは有効なだけです。 persistence-unitがエンタープライズアーカイブ(.ear)の一部としてデプロイされる場合-それ以外の場合(.war)では、persistence.xmlは/ META-INF /に存在する必要があり、persistence-unitの外部にあるクラスを参照できません(参照: http://javahowto.blogspot.com/2007/06/where-to-put-persistencexml-in-web-app.html )。したがって、私の知る限り、WEB-INF/classesに存在しないクラスを参照するpersistence.xmlをWEB-INF/classes/META-INFに配置する方法はありません。
Jsrを見ると常に機能します!
8.2.1.6.3 JARファイル
1つ以上のJARファイルは、
jar-file
要素で指定されたマッピングファイルの代わりに、またはそれに加えて、mapping-file
要素を使用して指定できます。指定した場合、これらのJARファイルはマネージ永続クラスを検索し、それらで見つかったマッピングメタデータアノテーションは処理されるか、この仕様で定義されているマッピングアノテーションのデフォルトを使用してマッピングされます。このようなJARファイルは、永続ユニットのルートを含むディレクトリまたはjarファイルを基準にして指定されます。次の例は、
jar-file
要素を使用して追加の永続性クラスを参照する方法を示しています。これらの例では、「PUnit」で終わる名前のjarファイルにはpersistence.xml
ファイルが含まれ、「Entities」で終わる名前のjarファイルには追加の永続クラスが含まれるという規則を使用しています。
Example 1:
app.ear
lib/earEntities.jar
earRootPUnit.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>lib/earEntities.jar</jar-file>
Example 2:
app.ear
lib/earEntities.jar
lib/earLibPUnit.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>earEntities.jar</jar-file>
Example 3:
app.ear
lib/earEntities.jar
ejbjar.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>lib/earEntities.jar</jar-file>
Example 4:
app.ear
war1.war
WEB-INF/lib/warEntities.jar
WEB-INF/lib/warPUnit.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>warEntities.jar</jar-file>
Example 5:
app.ear
war2.war
WEB-INF/lib/warEntities.jar
WEB-INF/classes/META-INF/persistence.xml
persistence.xml contains:
<jar-file>lib/warEntities.jar</jar-file>
Example 6:
app.ear
lib/earEntities.jar
war2.war
WEB-INF/classes/META-INF/persistence.xml
persistence.xml contains:
<jar-file>../../lib/earEntities.jar</jar-file>
Example 7:
app.ear
lib/earEntities.jar
war1.war
WEB-INF/lib/warPUnit.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>../../../lib/earEntities.jar</jar-file>
ご覧のとおり、warファイルの例はありません。上の例のすべてのwarファイルは、earファイル内にあります!
しかし、warファイルでテストしましたが、jarファイルの絶対パスを指定した場合にのみ機能し、実稼働環境には適していません。
war2.war
WEB-INF/lib/warEntities.jar
WEB-INF/classes/META-INF/persistence.xml
persistence.xml contains:
<jar-file>lib/warEntities.jar</jar-file>
この形式はwarファイルで機能します。私はWildlfy 8.2.0とJPA 2.1を使用しています
これがWARとしてデプロイしているという事実に関連していることはわかりませんが、パスは単に「app-sevices-1.0.jar」で、jarはJava = EEアプリケーション。問題は、これが単純化された「戦争」で使用できるかどうかわからないJava EEアプリケーション。これは、従来のJava EEデプロイメントファイル(ear)。webappのWAR、PUのJAR、およびapp-servicesのその他のJARを含む従来のJava EEデプロイメントはそうなります。
もう1つ注意すべき点は、相対パスはサポートされておらず、SE環境での使用はすべてのベンダーでサポートされているわけではないことです。