web-dev-qa-db-ja.com

JPA persistence.xml META-INFが正しく機能しない

私のpersistence.xmlファイルの場所に関しては困惑しています。私はJPA 2.0実装としてeclipselink 2.4を使用しており、多くの投稿の状態と同じようにsrc/main/resources/META-INF/persistence.xmlの下にpersistence.xmlを配置しています。

最初の問題: Eclipse内のサーバーに公開した後、persistence.xmlが見つからないというエラーが表示されます。

Exception: : Java.lang.IllegalArgumentException: No persistence unit named 'X'
is available in scope Webapp. Available persistence units: [] at

enter image description here

これが私の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="X" transaction-type="JTA">
<provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>localJTA</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
    <property name="eclipselink.target-server" value="WebLogic"/>
    <property name="eclipselink.logging.level" value="FINEST"/>          
</properties>
</persistence-unit>
</persistence>

META-INFをwebapp/WEB-INF/classes/META-INFに移動すると、動作します!問題が何なのか理解できません。

enter image description here

私はプロジェクトのビルドパスを確認しましたが、すべて問題ありません。

enter image description here

2番目の問題私が持っているのは、注釈付きのエンティティークラスがeclipselinkによって自動的に取得されないことです。私のJPA構成では、Discover注釈付きクラスが自動的に選択されています。

enter image description here

私は自分のxmlにも以下を持っています

<exclude-unlisted-classes>false</exclude-unlisted-classes>

使用されているテクノロジー:weblogic 12cサーバー、EJB 3.1、JPA 2.0、M2E-WTP、およびJSF 2.1

pdate 1: META-INFをパスsrc/main/resources/META-INF/persistence.xmlに残し、mavenインストールを実行してwarファイルをビルドすると、META-INFフォルダーはWEBに正しく配置されます-INF/classes/META-INF/persistence.xmlのように(戦争中)。これは、webappがEclipseでローカルにビルドおよび実行されたときの問題であると思われます。誰かがこれを説明できますか?

pdate 2:エンティティクラスを明示的にリストするのではなく、src/main/resourcesにMETA-INFを残します。

<exclude-unlisted-classes>false</exclude-unlisted-classes>

戦争を構築し、Internet Explorerを介してweblogicコンソールからデプロイした場合に機能します。なぜEclipse内で動作しないのですか?

更新3:
ビルドされたものを調べましたか-はい、Eclipse内でビルドが自動的に設定されています。プロジェクトフォルダーを見ると、Javaパッケージcom、persistence.xmlを含むMETA-INFフォルダー、およびWebapp/target/classesの下にあるリソースフォルダーがあります。
戦争が同じ場合-C:\ workspace.metadata.plugins\org.Eclipse.wst.server.core\tmp0にあるWebapp.warフォルダーを参照していますか?\Weblogic12cDomain_auto_generated_ear_\Webapp.war?もしそうなら、そこにある唯一のものはWEB-INF\lib\jsf-impl-2.1.7.jarです
それから、Eclipseでアプリをテストするために使用されているクラスパスを検査しましたか-このエントリは、クラスパスのWebapp/.classpathで期待どおりに見つかります
リソースディレクトリ内のpersistence.xmlが最初にクラスパス上にある場合、戦争内のディレクトリまたは正しいディレクトリ内の1つではなくピックアップされます-私の理解はEclipseですプロジェクトをビルドし、WARファイルを生成せずにコンテンツをサーバーにコピーします。

これは、mavenで生成されたWebapp.warのルートにあるものです。

enter image description here

以下は、Webappプロジェクトフォルダーのルートにあるものです。

enter image description here

これは、C:\ workspace.metadata.plugins\org.Eclipse.wst.server.core\tmp0\Weblogic12cDomain_auto_generated_ear_\Webapp.warの下のWebapp.war FOLDERのルートにあるものです。

enter image description here

リソースディレクトリのpersistence.xmlが最初にクラスパス上にある場合、戦争内のディレクトリまたは正しいディレクトリ内の1つではなくピックアップされます。-これが何を意味するのかわからない。私のresource/META-INFのpersistence.xmlは、私がピックアップしたいものです。 warファイルがそれとどう関係しているのか分からないのですか?どちらにしても、私が思うに同じpersistence.xmlでなければなりません。

どんな助けでも大歓迎です!!

14
Padawan

ここには少なくとも2つの問題があると思います。

1)Mavenビルド

プロジェクトにはEclipse Webプロジェクト構造ではなくMaven構造があるため、デフォルトではEclipseビルドではなく、Mavenコマンドを使用してビルドする必要があります。 (私はMavenエキスパートではないので、真実でない場合は、Mavenエキスパートがジャンプしてコメントしてください)。したがって、Eclipseで自動ビルドを実行している場合、src/main/resources/META-INF/persistence.xmlをWEB-INF/classes/META-INF/persistence.xmlにコピーしてコンパイルするだけでよいかわかりません= Javaクラス。

2)展開

Eclipseプロジェクト構造に従っている場合、「サーバーに追加」を選択すると、Eclipseはプロジェクトをパックしてサーバーに追加する方法を認識します。 mavenを使用している場合、ビルドされたwarは通常、ターゲットディレクトリにあります。そのため、この戦争をエクスポートして、WebLogicツールを使用してインストールするか、mavenタスクを使用してインストールする必要があります。

チェック WebLogic Server with Maven and Eclipse OracleがEclipseをWebLogicおよびMavenで使用することを提案する方法

5
Gas

JPA仕様のセクション8.2.1には、「persistence.xmlファイルは永続性ユニットのルートのMETA-INFディレクトリにあります」と記載されています。その後、「マネージ永続クラスは永続ユニットのルート内に含まれる場合があります。または、参照、つまり、クラス、クラスアーカイブ、またはXMLマッピングファイル(クラスを参照)アプリケーションクラスパスでアクセス可能」

したがって、永続性ユニットのルートは、META-INFディレクトリディレクトリの場所です。クラスをクラスディレクトリに配置すると、永続化ユニットのルートにないため、含めるには明示的に名前を付ける必要があります。

5
Chris

あなたはmavenについて決して言及しないので、それがあなたの皿にあるかどうかはわかりません。 hibernate-entitymanagerの依存関係を追加するまで、mavenではうまくいきませんでした。私のpom.xmlにはhibernate-coreしかありませんでした。 hibernate-entitymanagerを追加した後、(テスト用に)機能し始めました。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.1.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.1.Final</version>
</dependency>
2
lumpynose

Persistence.xmlが戦争内にあるかどうかを確認します。または、そうでないか、または間違った場所にあります。このファイルをJava/main/resourcesフォルダー内に配置して、クラスパスに配置することもできます。

0
bhermont