JPAを使用してJavaSEアプリケーションを開発しています。残念ながら、呼び出し後にnull
を取得します:Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
以下が見つかります:
EntityManagerFactory
を呼び出し、予期せずnull
を返すコードのスニペットpersistence.xml
ファイルコードのスニペット:
public class Main {
private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU";
private static EntityManagerFactory factory;
public static void main(String[] args) {
// I get null on this line!!!
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
// do stuff with entity manager
...
}
}
My persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
<persistence-unit name="MeineJpaPU" transaction-type="RESOURCE_LOCAL">
<provider>org.Apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>path.to.package.server.Todo</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>
<property name="javax.persistence.jdbc.user" value="postgres"/>
<property name="javax.persistence.jdbc.password" value="postgres"/>
</properties>
</persistence-unit>
</persistence>
私のプロジェクト構造:
persistence.xml
ファイルを適切な場所に移動する必要があります。
具体的には、META-INF/persistence.xml
ファイルをソースフォルダーのルートに追加します。
この場合、次が適切な場所です。src\main\Java\META-INF\persistence.xml
詳細は次のとおりです:(JPA仕様)
Persistence.xmlファイルは、永続性ユニットを定義します。 persistence.xmlファイルは、永続性ユニットのルートのMETA-INFディレクトリにあります。
ここでは、永続性ユニットのルートが重要です。
非Java EEアプリの場合
META-INFディレクトリにpersistence.xmlファイルが含まれるjarファイルまたはディレクトリは、永続性ユニットのルートと呼ばれます。
Java EEアプリを使用している場合、以下が有効です
Java EE環境では、永続性ユニットのルートは次のいずれかでなければなりません。
- eJB-JARファイル
- wARファイルのWEB-INF/classesディレクトリ[80]
- wARファイルのWEB-INF/libディレクトリにあるjarファイル
- eARライブラリディレクトリ内のjarファイル
- アプリケーションクライアントjarファイル
クイックアドバイス:
スタンドアロンアプリケーション(JavaEEの外部)でJPAを使用する場合、永続性プロバイダーをどこかで指定する必要があります。これは、私が知っている2つの方法で実行できます。
<provider>org.hibernate.ejb.HibernatePersistence</provider>
(Chrisの正解に記載されています: https://stackoverflow.com/a/1285436/784594 )私の場合、Mavenの設定ミスにより、一時的な依存関係であっても、hibernate-entitymanager.jarが依存関係として含まれていないことがわかりました。他のモジュールの。
こちらの回答も参照してください: EntityManagerの永続プロバイダーは指定されていません
私は最近NB 8.1から8.2にアップグレードし、突然この問題に直面し、解決するために2日間頭を壊しました。持続した。
最後に、eclipselink.jarがEclipseLink(JPA 2.1)のデフォルトライブラリにないことがわかりました。ライブラリと出来上がりの定義にファイルを追加しました-動作し始めました!
META-INFフォルダーを移動したくない場合(多分IDEで作成し、混乱させたくない)、Mavenを使用している場合) <resources>
tagを使用してMavenにMETA-INFを探す場所を指示できます。 http://maven.Apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
あなたの場合:
<build>
<resources>
<resource>
<directory>src</directory>
</resource>
</resources>
</build>
私の場合、すべてがクラスパスにありましたが、追加する必要がありました
クラスc = Class.forName( "org.Eclipse.persistence.jpa.PersistenceProvider");
これにより、PersistenceProviderがjavaxクラスに自身を登録したと思います。過去にもJDBCドライバーに対して同様のことをしなければなりませんでした。
JPA依存関係を明示的に提供しない
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
おかげで、
ラーフル