web-dev-qa-db-ja.com

EntityManagerの永続プロバイダーは指定されていません

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

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

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

 2009-07-21 09:22:41,018 [main]エラー-agisdb 
 javax.persistence.PersistenceExceptionという名前のEntityManagerの永続プロバイダーはありません:agisdb 
という名前のEntityManagerの永続プロバイダーはありませんjavax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:89)
 at 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>

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

138
Robert A Henru

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

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

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

EclipseProject Properties -> Java Build Path -> Libraries.のようなIDEを実行している場合

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

86
Ualter Jr.

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

66
user225932

Pom.xmlファイルでこれが必要でした:

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

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

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

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

here からソリューションを取得しました

15
Sneg

<provider>org.hibernate.ejb.HibernatePersistence</provider>のような1つのプロバイダーを定義したが、jar内の別のプロバイダーを参照している可能性があります。 persistence.xmlプロバイダーはopenjpaでしたが、クラスパスでeclipselinkを使用していました。このヘルプを願っています!

9
Gilberto

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

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

9
col.panic

クイックアドバイス:

  • 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が依存関係として含まれていないことがわかりました。

7
OndroMih

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

  1. プロパティ-> Javaビルドパス->ソースタブに移動します
  2. にある除外パターンを確認してください
    MyProject/src/main/Java -> Excluded: <your_pattern>
    ツリーノード
  3. オプションで、ノードを選択し、左側の編集...ボタンをクリックして、Excluded: (None)に設定します。
5
wypieprz

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

No Persistence provider for EntityManager named mick

Hibernateチュートリアルのサンプルをビルドしてみましたが、Java 10を使用していたため、簡単にビルドして実行することができませんでした。私はそれをあきらめ、問題を修正するのに時間を無駄にしたくありません。 module-info.Javaファイル(Jigsaw)のセットアップは、多くの人がまだ発見していない別のヘアボールです。

やや紛らわしいのは、build.gradleファイルで必要な2つのファイル(以下)だけであるということです。 Hibernateのドキュメントには、どのJarsを含める必要があるかが明確ではありません。 Entity-managerは混乱の原因となっていたため、最新のHibernateバージョンでは不要になり、javax.persistence-apiも不要になりました。ここでJava 10を使用しているため、jaxb-apiを含めてxml-bindエラーを回避し、module-info.Javaファイルに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つのフィールドを持つ単一のテストエンティティです。この例外には多くの原因があるようです。

4
MickG

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

4
Rob

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

3
harcharan

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

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

2
vijayinani

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

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

同じ問題に直面しましたが、 EclipseLinkバージョン2.5. でした。

必ず(javax.persistence_2.1.0.v201304241213.jar.jar);という別のjarファイルを追加して問題を解決しました。

必要なジャー:
-javax.persistence_2.1.0.v201304241213.jar
-eclipselink.jar
-jdbc.jar(使用するデータベースに依存)。

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

2
E_X

Mavenを使用している場合、META-INFフォルダーの適切な場所が表示されていない可能性があります。他の人はフォルダーのコピーについて言及しましたが、私のために働いた別の方法は、<resources>タグを使用して、Mavenにそれを探す場所を指示することでした。参照: http://maven.Apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

2
esfandia

このエラーも発生しましたが、問題はpersistence.xmlの名前空間uriでした。

http://xmlns.jcp.org/xml/ns/persistencehttp://Java.Sun.com/xml/ns/persistenceに、バージョン2.1を2.0に置き換えました。

現在は機能しています。

2

META-INFをsrcにコピーして作業しました!

1
Zakaria Bouazza

クラスパスに次の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
yeafee

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

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を更新しません。私はサーバーを再起動する必要があり、それから動作しました。

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。最終
  8. hibernate-core-5.2.5。最終
  9. hibernate-jpa-2.1-api-1.0.0.Final
  10. jandex-2.0.3。最終
  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。最終
  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クラスを作成します。パッケージ内の私の例UserDetailにある名前org.pramod.data.object

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
Prayag Sharma

OSGiコンテキストでは、バンドルのMANIFEST.MFに永続性ユニットをリストする必要があります。

JPA-PersistenceUnits: my-persistence-unit

そうしないと、JPAバンドルは、バンドルに永続性ユニットが含まれていることを認識しません。

http://wiki.Eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE を参照してください。

1
schieferstapel

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
Dhwaneel

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

0
burseaner

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

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

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

奇妙なエラー、私はそれのために完全に混乱しました。

0
Wojtek Piróg

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

<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
Atul Jain