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>
クラスパスにあるはずです。それでも、上記のエラーが発生しました。
<persistence-unit name="agisdb">
の後に、永続化プロバイダー名を定義します。
<provider>org.hibernate.ejb.HibernatePersistence</provider>
"hibernate-entitymanager.jar"
をアプリケーションのクラスパスに配置します。
新しいバージョンでは、非推奨の"hibernate-core.jar"
の代わりにhibernate-entitymanager
を使用する必要があります
Eclipse:Project Properties -> Java Build Path -> Libraries.
のようなIDEを実行している場合
それ以外の場合は、アプリケーションの/lib
に配置します。
persistence.xml
ファイルがディレクトリにあることを確認してください:<webroot>/WEB-INF/classes/META-INF
Pom.xmlファイルでこれが必要でした:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.6.Final</version>
</dependency>
同じ問題に直面し、長い間解決策を見つけることができませんでした。私の場合、それは交換するのに役立ちました
<provider>org.hibernate.ejb.HibernatePersistence</provider>
と
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
here からソリューションを取得しました
<provider>org.hibernate.ejb.HibernatePersistence</provider>
のような1つのプロバイダーを定義したが、jar内の別のプロバイダーを参照している可能性があります。 persistence.xmlプロバイダーはopenjpaでしたが、クラスパスでeclipselinkを使用していました。このヘルプを願っています!
別のポイントがあります:Eclipse RCP環境内でこの問題に直面した場合、ファクトリー生成をPersistence.createEntityManagerFactory
からnew PersistenceProvider().createEntityManagerFactory
に変更する必要があるかもしれません
詳細については、 ECF を参照してください。
クイックアドバイス:
スタンドアロンアプリケーション(JavaEEの外部)でJPAを使用する場合、永続性プロバイダーをどこかで指定する必要があります。これは、私が知っている2つの方法で実行できます。
<provider>org.hibernate.ejb.HibernatePersistence</provider>
(Chrisの正解に記載されているとおり: https://stackoverflow.com/a/1285436/784594 )私の場合、Mavenの設定ミスにより、他のモジュールの一時的な依存関係であっても、hibernate-entitymanager jarが依存関係として含まれていないことがわかりました。
Eclipseを使用している場合は、除外パターンがビルドパス上のソースフォルダーからpersistence.xml
を削除しないことを確認してください。
MyProject/src/main/Java -> Excluded: <your_pattern>
Excluded: (None)
に設定します。私はここでパーティーに数年遅れていますが、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つのフィールドを持つ単一のテストエンティティです。この例外には多くの原因があるようです。
コーナーケース:m2Eclipseを使用している場合、自動的にリソースフォルダーに除外が設定されます。その後、Eclipse内でテストを実行しようとすると、persistence.xmlが後に存在しないため、このエラーが生成されます。
「src」フォルダーの下にpersistence.xmlファイルが作成されていることを確認してください。プロジェクトフォルダの下に作成しましたが、それが問題でした。
クラスパスにhibernate-entitymanager-x.jarを追加する必要があります。
Hibernate 4.xでは、jarが存在する場合、persistence.xmlファイルにorg.hibernate.ejb.HibernatePersistenceを追加する必要はありません。
エンティティマネージャが多くの永続性ユニットをポイントしようとしているときに発生します。次の手順を実行します。
同じ問題に直面しましたが、 EclipseLinkバージョン2.5. でした。
必ず(javax.persistence_2.1.0.v201304241213.jar.jar);という別のjarファイルを追加して問題を解決しました。
必要なジャー:
-javax.persistence_2.1.0.v201304241213.jar
-eclipselink.jar
-jdbc.jar(使用するデータベースに依存)。
これがお役に立てば幸いです。
Mavenを使用している場合、META-INFフォルダーの適切な場所が表示されていない可能性があります。他の人はフォルダーのコピーについて言及しましたが、私のために働いた別の方法は、<resources>
タグを使用して、Mavenにそれを探す場所を指示することでした。参照: http://maven.Apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
このエラーも発生しましたが、問題はpersistence.xml
の名前空間uriでした。
http://xmlns.jcp.org/xml/ns/persistence
をhttp://Java.Sun.com/xml/ns/persistence
に、バージョン2.1を2.0に置き換えました。
現在は機能しています。
META-INFをsrcにコピーして作業しました!
クラスパスに次のjarファイルが必要です。
質問はすでに回答されていますが、私を支えていたヒントを投稿したかっただけです。この例外は、以前のエラーの後にスローされていました。私はこれを得ていました:
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/ からダウンロードできます
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>
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
OSGiコンテキストでは、バンドルのMANIFEST.MFに永続性ユニットをリストする必要があります。
JPA-PersistenceUnits: my-persistence-unit
そうしないと、JPAバンドルは、バンドルに永続性ユニットが含まれていることを認識しません。
http://wiki.Eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE を参照してください。
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>
異なるクラスのPersistence.createEntityManagerFactory("JPAService")
に異なる名前がある場合、エラーが発生します。 リファクタリングにより、異なる名前を取得することが可能ですこれは私の場合でした。 1つのクラスでは、自動生成されたPersistence.createEntityManagerFactory("JPAService")
in private void initComponents()
、ContactsTableクラスは、DBManagerクラスのPersistence.createEntityManagerFactory("JPAServiceExtended")
とは異なりました。
私の場合、以下の2つのプロパティの間違いについてでした。それらを変更すると、「指定されたEntityManagerの永続プロバイダーはありません」が無効になりました。
そのため、プロパティとの接続をテストして、すべてが正しいかどうかを確認できます。
<property name="javax.persistence.jdbc.url" value="...”/>
<property name="javax.persistence.jdbc.password" value="...”/>
奇妙なエラー、私はそれのために完全に混乱しました。
永続的なユニット名を確認する
<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**);