指定されたEntityManagerの永続性プロバイダーがありません


148

私はディレクトリの下でpersistence.xml同じ名前を使用TopLinkしていMETA-INFます。それから、私はそれを呼び出すコードを持っています:

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");

それでも、次のエラーメッセージが表示されました。

2009-07-21 09:22:41,018 [メイン]エラー-agisdbという名前のEntityManagerの永続性プロバイダーがありません
javax.persistence.PersistenceException:agisdbという名前のEntityManagerの永続性プロバイダーがありません
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)で
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)で

ここにありますpersistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="agisdb">
        <class>com.agis.livedb.domain.AddressEntity</class>
        <class>com.agis.livedb.domain.TrafficCameraEntity</class>
        <class>com.agis.livedb.domain.TrafficPhotoEntity</class>
        <class>com.agis.livedb.domain.TrafficReportEntity</class>
        <properties>
            <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/>
            <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="toplink.jdbc.user" value="root"/>
            <property name="toplink.jdbc.password" value="password"/>
        </properties>
    </persistence-unit>
</persistence>

クラスパスにあるはずです。それでも、上記のエラーが発生しました。

回答:


85

の後<persistence-unit name="agisdb">、永続化プロバイダー名を定義します。

<provider>org.hibernate.ejb.HibernatePersistence</provider>

5
私はDerbyを使用しており、これを指定する必要はありませんでした(指定しましたが、念のため、問題を解決したら削除しました)。プロジェクトのEclipseソースパスのフォルダーにあったにもかかわらず、persistence.xmlがsrc / META-INFフォルダーになかったため、最終的にエラーが発生しました。どこかでsrc / *に
固定さ

6
これは私の場合は必要ありませんでしたが、以下のUalter Jrの回答で述べられているようにhibernate-entitymanager * .jarクラスパス化します。hibernate-core-4.3.7.jarhibernate-entitymanager-4.3.7.Final.jarおよびhibernate-jpa-2.1-api-1.0.0.jarでスタンドアロンGWTアプリを使用しています。
Andreas Dietrich

3
@AndreasDietrichと同様に、pom.xml(mavenを使用)で「hibernate-core-4.3.10」アーティファクトを「hibernate-entitymanager-4.3.10」に置き換えた後、このエラーはなくなりました。実際、hibernate.org / orm / downloadsには、JPAには「hibernate-entitymanager-4.3.10」を使用する必要があると記載されています。
香港

1
これとは別に、私はhibernate-entitymanager-3.4.0.GAから3.6.10.Final移動する必要もありました。Hibernate 3を使用しているレガシーコードベースがまだある場合に備えて
Javi Vazquez

5
私は少しあなたが問題に遭遇していない驚いてるあなた<provider/>、休止状態-4を使用している間に、あなたのプロバイダを変更する必要があり<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>、参照stackoverflow.com/questions/23041964/...を
Rob

86

"hibernate-entitymanager.jar"アプリケーションのクラスパスにを入れます。
新しいバージョンの場合"hibernate-core.jar"は、非推奨の代わりに使用する必要がありますhibernate-entitymanager

EclipseなどのIDEを使用している場合:Project Properties -> Java Build Path -> Libraries.

それ以外の場合/libは、アプリケーションに配置します。


3
これが原因だと理解するのに数時間かかった。この流血のjarファイルを検索する他の人(Hibernate 4.1.3の場合)は、hibernate-release-4.1.3.Final \ lib \ jpa \ hibernate-entitymanager-4.1.3.Final.jarにあります
Vedran

7
そして、Mavenを使用している私たちにとっては、それはgroupid org.hibernateアーティファクトですhibernate-entitymanager
Simon Forsberg、2013

2
それは私にとってeclipselink.jarでしたが、パスにありませんでした。パスにhibernate * something.jarがまったくありません。
ユーザー不明。

3
数時間かけて、persistence.xmlがクラスパス上にあることを確認し、これが機能するプロジェクトと機能しないプロジェクトのすべての面を比較しました。persistence.xmlが欠落している場合、その名前のPUが欠落している場合、または明らかにhibernate jarが欠落している場合に発生する可能性があるため、非常に誤解を招くエラーメッセージです。
David Mann

私にとってはorg.eclipse.persistence.jpa、スコープテストでした。
Marek

67

persistence.xmlファイルがディレクトリにあることを確認してください:<webroot>/WEB-INF/classes/META-INF


8
これは私にとってはうまくいきませんでした、永続化ユニットが見つかりませんでした:「null」エラー。/src/main/resources/META-INF/persistence.xmlに戻します
tomasb

1
これは、トップリンク(または他のWeb関連のもの)を使用している人に当てはまると思います。
Simon Forsberg、2013

2
おかげで、私にとってのパスはtarget / classes / META-INFです
Frizz1977

同じ、何らかの奇妙な理由で、META-INFディレクトリにある必要があり、そうでなければ機能しません...
Thomas

17

私はこれを私のpom.xmlファイルで必要としました:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.2.6.Final</version>
</dependency>

バージョン4.3.11で動作します。
petertc 2015

上記は非推奨です。代わりにhibernate-coreを使用してください。
foo

16

同じ問題に直面し、長い間解決策を見つけることができませんでした。私の場合、それは交換するのに役立ちました

<provider>org.hibernate.ejb.HibernatePersistence</provider>

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

ここから解決策を取りました


2
Hibernate 4.3.5から5.2.12にアップグレードしていて、このプロバイダー名の変更により問題が解決しました。その設定により、JPAは、Mavenセントラルリポジトリで非推奨と表示されるentity-manger .jarではなく、コア.jarファイルを使用できるように見えます。共有してくれてありがとう。
joshpt 2017年

10

別のポイントがあります。EclipseRCP環境内でこの問題に直面した場合、ファクトリーの世代をからPersistence.createEntityManagerFactoryに変更する必要があるかもしれません。new PersistenceProvider().createEntityManagerFactory

詳細については、ECFを参照してください。


これは、私がorg.eclipse.persistence.jpa 2.4.0で抱えていた正確な問題でした。文字通り2時間かけて髪を抜くと、なぜpersisence.xmlが見つからなかったのかと思いました。すべての例がこれを組み込んでいるようには見えません。ええと...たくさんの感謝!
Mark Miller

9

多分あなたはのように1つのプロバイダーを定義しました<provider>org.hibernate.ejb.HibernatePersistence</provider>が、jarで別のプロバイダーを参照しています。それは私に起こりました:私のpersistence.xmlプロバイダーはopenjpaでしたが、クラスパスでeclipselinkを使用していました。この助けを願っています!


7

クイックアドバイス:

  • 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を参照してください(これは通常、 hibernateまたは別のJPA実装をクラスパスに含めるときに含まれます

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


/ facepalm-hibernateプロバイダーにMaven依存関係を追加するのを忘れました。ありがとうございました!
jgitter 14

5

Eclipseを使用している場合は、除外パターンによってビルドパスのpersistence.xmlソースフォルダーからが削除されないことを確認してください。

  1. 移動し、プロパティ- > Javaのビルド・パス] - > [ソース ]タブ

  2. MyProject/src/main/java -> Excluded: <your_pattern>
    ツリーノードにある除外パターンを確認してください
  3. 必要に応じて、Excluded: (None)ノードを選択し、左側の[ 編集... ]ボタンをクリックしてに設定します。

私の問題を解決しました。フェッチ/プル後に除外パターンが「**」に設定されました。理由はわかりません...
Jocelyn

5

私はここのパーティーに数年遅れていますが、HSQLDBとデスクトップJavaFXプログラムでHibernate 3.5.1を動作させようとしているときに同じ例外に遭遇しました。このスレッドと多くの試行錯誤の助けを借りて動作するようになりました。さまざまな問題でこのエラーが発生するようです。

No Persistence provider for EntityManager named mick

hibernateチュートリアルのサンプルをビルドしてみましたが、Java 10を使用していたため、簡単にビルドして実行することができませんでした。私はあきらめました。問題の修正に時間を無駄にしたくないのです。module-info.javaファイル(ジグソー)の設定は、多くの人がまだ発見していないもう1つのヘアボールです。

やや混乱しているのは、これら(下記)がbuild.gradleファイルに必要な2つのファイルだけだったということです。Hibernateのドキュメントでは、どのJARを含める必要があるかが明確にされていません。Entity-managerは混乱を引き起こしていたため、最新のHibernateバージョンでは不要になり、javax.persistence-apiも不要になりました。ここではJava 10を使用しているので、jaxb-apiを含めて、xml-bindエラーを回避し、java-persistenceモジュールのエントリーをmodule-info.javaファイルに追加する必要がありました。

Build.gradle

// https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile('org.hibernate:hibernate-core:5.3.1.Final')

// https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'

Module-info.java

// Used for HsqlDB - add the hibernate-core jar to build.gradle too
requires java.persistence;

hibernate 5.3.1では、persistence.xmlファイルで以下のプロバイダーを指定する必要はありません。指定しない場合、デフォルトでHibernateプロバイダーが選択されます。

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

persistence.xmlファイルは正しいディレクトリに配置する必要があります。

src/main/resources/META-INF/persistence.xml

Intellijデバッガーで方言をチェックするhibernateソースコードをステップ実行すると、persistence.xmlファイルに方言プロパティがないため、まったく同じ例外がスローされました。私はこれを追加しました(DBタイプに合ったものを追加してください):

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

この後も引き続き同じ例外が発生したため、Intellijでデバッガーをもう一度ステップ実行すると、永続化しようとしているテストエンティティ(単純な親子の例)にOneToMany、ManyToOne関係のアノテーションがないことがわかりました。私はこれを修正し、例外はなくなり、エンティティは問題なく保持されました。

これが私の完全な最後のpersistence.xmlです:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
            http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="mick" transaction-type="RESOURCE_LOCAL">
    <description>
        Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
    </description>

    <!-- Provided in latest release of hibernate
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    -->

    <class>com.micks.scenebuilderdemo.database.Parent</class>
    <class>com.micks.scenebuilderdemo.database.Child</class>

    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>

        <property name="javax.persistence.jdbc.url"
                  value="jdbc:hsqldb:file:./database/database;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>

        <property name="javax.persistence.jdbc.user" value="sa"/>
        <property name="javax.persistence.jdbc.password" value=""/>

        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    </properties>

</persistence-unit>

</persistence>

私はおそらくこの宝石で約半日を無駄にしました。私のアドバイスは、非常に単純なものから始めることです。この例外には多くの原因があると思われるため、1つまたは2つのフィールドを持つ単一のテストエンティティです。


設定の詳細についてはたくさんありがとうございますそれを解決するのに本当に役立ちました。
Doogle

4

コーナーケース:m2Eclipseを使用している場合、リソースフォルダーに除外が自動的に配置されます。次に、eclipse内でテストを実行しようとすると、persistence.xmlがないためにこのエラーが発生します。


3

'src'フォルダーの下にpersistence.xmlファイルが作成されていることを確認してください。私はプロジェクトフォルダの下に作成しましたが、それが私の問題でした。


Eclipse 4.4.0はSRCフォルダーをネストしたくないので、クラスパス上にpersistence.xmlがあれば十分だと考えて、META-INFを最上位に置きました。ない!(オペレーティングシステムで)src / META-INFを手動で作成し、persistence.xmlファイルを手動で移動する必要がありました。おそらくこれをEclipseで実行することは可能ですが、理解できませんでした。
Fuhrmanator 2014


2

これは、エンティティマネージャーが多くの永続性ユニットをポイントしようとしているときに発生します。次の手順を実行します。

  1. エディターで関連ファイルを開きます(プロジェクトがIDEで閉じられている場合)
  2. すべての永続性およびエンティティマネージャー関連のコードを削除します
  3. ファイルを保存する
  4. IDEでプロジェクトを開きます
  5. 次に、選択したデータベースまたはテーブルをバインドします

2

私は同じ問題に直面しましたが、EclipseLinkバージョン2.5.0です。

私は必然的に(javax.persistence_2.1.0.v201304241213.jar.jar)だった別のjarファイルを追加することで問題を解決しました。

必要なJAR:
-javax.persistence_2.1.0.v201304241213.jar
-eclipselink.jar
-jdbc.jar(使用するデータベースによって異なります)。

これがお役に立てば幸いです。


2

私にもこのエラーがありましたが、問題はの名前空間uriでしたpersistence.xml

バージョン2.1から2.0 に置き換えましhttp://xmlns.jcp.org/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence

現在は機能しています。


これが、Tomcatを使用して私に起こったことです。新しいユーザーを明確にするために、完全なヘッダーを追加しました
childno –.de

2

クラスパスにhibernate-entitymanager-x.jarを追加する必要があります。

Hibernate 4.xでは、jarが存在する場合、persistence.xmlファイルにorg.hibernate.ejb.HibernatePersistenceを追加する必要はありません。


1

質問はすでに回答されていますが、私を妨げているヒントを投稿したかっただけです。この例外は、以前のエラーの後にスローされていました。私はこれを得ていました:

property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.

新しいプロパティ名を含めるようにpersistence.xmlを変更しましたが、

<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>

廃止されたプロパティ名に関するメッセージに続いて、上記と同じPersistenceExceptionとその他の例外の文字列全体が表示されました。私のヒント:例外ソーセージの始まりを確認してください。

Glassfish v2.1.1にはバグがあり、再デプロイまたはアンデプロイとデプロイが、どこかにキャッシュされているpersistence.xmlを更新しないようです。サーバーを再起動する必要があり、それが機能しました。



1

クラスパスに次のjarファイルが必要です。

  1. antlr-2.7.6.jar
  2. commons-collections-3.1.jar
  3. dom4j-1.6.1.jar
  4. hibernate-commons-annotations-4.0.1.Final.jar
  5. hibernate-core-4.0.1.Final.jar
  6. hibernate-entitymanager.jar
  7. hibernate-jpa-2.0-api-1.0.0.Final.jar
  8. javassist-3.9.0.jar
  9. jboss-logging-3.1.1.GA.jar
  10. jta-1.1.jar
  11. slf4j-api-1.5.8.jar
  12. xxx-jdbc-driver.jar


1

Hibernate 5.2.5
クラスパスに必要なJARファイル。これは、Hibernate 5.2.5最終リリースの必須フォルダ内にあります。http://hibernate.org/orm/downloads/からダウンロードできます。

  1. antlr-2.7.7
  2. cdi-api-1.1
  3. クラスメート-1.3.0
  4. dom4j-1.6.1
  5. el-api-2.2
  6. geronimo-jta_1.1_spec-1.1.1
  7. hibernate-commons-annotation-5.0.1.Final
  8. hibernate-core-5.2.5.Final
  9. hibernate-jpa-2.1-api-1.0.0.Final
  10. jandex-2.0.3.Final
  11. javassist-3.20.0-GA
  12. javax.inject-1
  13. jboss-interceptor-api_1.1_spec-1.0.0.Beta1
  14. jboss-logging-3.3.0.Final
  15. jsr250-api-1.0

でxmlファイル「persistence.xml」を作成します

YourProject / src / META-INF / persistence.xml

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
         http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="sample">

    <class>org.pramod.data.object.UserDetail</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate_project"/>
        <property name="hibernate.connection.username" value="root"/>
        <property name="hibernate.connection.password" value="root"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="false"/>

        <property name="hibernate.cache.use_second_level_cache" value="false"/>

        <property name="hibernate.archive.autodetection" value="true"/>
    </properties>
</persistence-unit>

  1. <persistance>タグで言及されている情報を書き留めてください。バージョンは2.1である必要があります。
  2. 名前<persistance-unit>タグに注意してください。名前は"sample"と表記されています。この名前は、ロード中にまったく同じように使用する必要があります

EntityManagerFactor = Persistance.createEntityManagerFactory( "sample"); 。「サンプル」は、命名規則に従って変更できます。

次に、Entityクラスを作成します。org.pramod.data.objectパッケージ内の、私の例UserDetailに基づく名前

UserDetail.java

package org.pramod.data.object;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user_detail")
public class UserDetail {
    @Id
    @Column(name="user_id")
    private int id;
    @Column(name="user_name")
    private String userName;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }   
    @Override
    public String toString() {
       return "UserDetail [id=" + id + ", userName=" + userName + "]";
    }
}

次に、mainメソッドでクラスを作成します。

HibernateTest.java

package org.pramod.hibernate;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.pramod.data.object.UserDetail;

public class HibernateTest {
    private static EntityManagerFactory entityManagerFactory;

    public static void main(String[] args)  {
        UserDetail user = new UserDetail();
        user.setId(1);
        user.setUserName("Pramod Sharma");

        try {
            entityManagerFactory = Persistence.createEntityManagerFactory("sample");
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            entityManager.getTransaction().begin();
            entityManager.persist( user );
            entityManager.getTransaction().commit();
            System.out.println("successfull");
            entityManager.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

出力は

UserDetail [id=1, userName=Pramod Sharma]
Hibernate: drop table if exists user_details
Hibernate: create table user_details (user_id integer not null, user_name varchar(255), primary key (user_id))
Hibernate: insert into user_details (user_name, user_id) values (?, ?)
successfull

1

私の場合は、以前に私は、データベーススキーマによってエンティティを生成するためのアイデアを使用して、persistence.xml自動的に生成されsrc/main/java/META-INF、かつに従ってhttps://stackoverflow.com/a/23890419/10701129、私はそれを移動しsrc/main/resources/META-INFても、マークMETA-INF、ソースルート。わたしにはできる。

しかし、元のMETA-INF(つまり、src / main / java / META-INF)をソースルートとしてマークするだけでは機能せず、混乱を招きます。

これは構造です: ここに画像の説明を入力してください


0

Persistence.createEntityManagerFactory("JPAService")異なるクラスに異なる名前があると、エラーが発生します。リファクタリングすることで、私の場合とは異なる名前を取得できます。で自動生成さPersistence.createEntityManagerFactory("JPAService")れた1つのクラスでprivate void initComponents()、ContactsTableクラスはPersistence.createEntityManagerFactory("JPAServiceExtended")DBManagerクラスとは異なりました。


0

鉱山はpersistence.xmlに情報を追加するなどして解決し<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>、クラスパスにライブラリがあることを確認します。例えばMavenに依存関係を追加します

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.5.0</version>
</dependency>

0

永続的なユニット名を確認する

<persistence-unit name="com.myapp.model.jpa"
    transaction-type="RESOURCE_LOCAL">    
public static final String PERSISTENCE_UNIT_NAME = "com.myapp.model.jpa";
Persistence.createEntityManagerFactory(**PERSISTENCE_UNIT_NAME**);

0

私の場合、以下の2つのプロパティの間違いについてです。それらを変更すると、「指定されたEntityManagerの永続性プロバイダーはありません」が消えました。

したがって、プロパティとの接続をテストして、すべてが正しいかどうかを確認できます。

<property name="javax.persistence.jdbc.url" value="...”/>
<property name="javax.persistence.jdbc.password" value="...”/>

奇妙なエラー、それが原因で私は完全に混乱しました。


0

また、persistence.xmlを手動でフォルダにコピーしてみてください<project root>\bin\META-INF。これEclipseLink 2.5.2により、単純なプラグインプロジェクトを使用したEclipse Neonの問題が修正されました。


0

同じ問題がありましたが、これは実際に私のために働きました:

mvn install -e  -Dmaven.repo.local=$WORKSPACE/.repository.

注:上記のmavenコマンドは、プロジェクトのすべての依存関係を最初から再インストールします。mavenが行うネットワーク要求により、コンソールには詳細ログがロードされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.