15

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
       ...
    }
}

私の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>

私のプロジェクト構造:

これは私のプロジェクトの構造です:

4

6 に答える 6

12

クイックアドバイス:

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

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

  • プロバイダー要素を永続化ユニットに追加ます<provider>org.hibernate.ejb.HibernatePersistence</provider>:
  • または、インターフェース javax.persistence.spi.PersistenceProvider のプロバイダーをサービスとして指定する必要があります。こちらを参照してください: http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html (これは通常、 hibernate または別の JPA 実装をクラスパスに含める場合に含まれます

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

こちらの回答も参照してください: No Persistence provider for EntityManager named

于 2014-03-06T12:30:06.053 に答える
1

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

Class c = Class.forName("org.eclipse.persistence.jpa.PersistenceProvider");

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

于 2014-09-25T20:17:50.563 に答える
1

最近、NB 8.1 を 8.2 にアップグレードしたところ、突然この問題に直面し、2 日間頭を悩ませて解決しました。8.1までは、プロセッサパスの削除(他の人が上で述べた)が機能していました。8.2 でも問題は解決しませんでした。

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

于 2016-12-23T01:31:17.033 に答える
0

Dont give JPA dependency explicity

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

Thanks,
Rahul

于 2017-09-20T09:42:58.907 に答える