web-dev-qa-db-ja.com

Xという名前のEntityManagerの永続プロバイダーはありません

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>

私のプロジェクト構造:

This is the structure of my project:

13
joshi737

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ファイル
16
cmd

クイックアドバイス:

  • persistence.xmlがクラスパスにあるかどうかを確認します
  • hibernateプロバイダーがクラスパスにあるかどうかを確認します

スタンドアロンアプリケーション(JavaEEの外部)でJPAを使用する場合、永続性プロバイダーをどこかで指定する必要があります。これは、私が知っている2つの方法で実行できます。

  • プロバイダー要素を永続性ユニットに追加する:<provider>org.hibernate.ejb.HibernatePersistence</provider>(Chrisの正解に記載されています: https://stackoverflow.com/a/1285436/784594
  • またはインターフェースjavax.persistence.spi.PersistenceProviderのプロバイダーをサービスとして指定する必要があります。こちらを参照してください: http://docs.Oracle.com/javase/6/docs/api/Java/util/ServiceLoader.html (これは通常、休止状態または別のJPA実装をクラスパスに含めるときに含まれます。

私の場合、Mavenの設定ミスにより、一時的な依存関係であっても、hibernate-entitymanager.jarが依存関係として含まれていないことがわかりました。他のモジュールの。

こちらの回答も参照してください: EntityManagerの永続プロバイダーは指定されていません

11
OndroMih

私は最近NB 8.1から8.2にアップグレードし、突然この問題に直面し、解決するために2日間頭を壊しました。持続した。

最後に、eclipselink.jarがEclipseLink(JPA 2.1)のデフォルトライブラリにないことがわかりました。ライブラリと出来上がりの定義にファイルを追加しました-動作し始めました!

1
Prerak Sheth

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>
0
esfandia

私の場合、すべてがクラスパスにありましたが、追加する必要がありました

クラスc = Class.forName( "org.Eclipse.persistence.jpa.PersistenceProvider");

これにより、PersistenceProviderがjavaxクラスに自身を登録したと思います。過去にもJDBCドライバーに対して同様のことをしなければなりませんでした。

0
RLZaleski

JPA依存関係を明示的に提供しない

        <dependency>
                    <groupId>javax.persistence</groupId>
                    <artifactId>persistence-api</artifactId>
                    <version>1.0.2</version>    
      </dependency>

おかげで、
ラーフル

0
rahulnikhare