EntityManager の永続プロバイダーの名前がありません
-
18-09-2019 - |
質問
私は私のものを持っています persistence.xml
同じ名前で使用して TopLink
下 META-INF
ディレクトリ。次に、コードを次のように呼び出します。
EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");
それでも、次のエラー メッセージが表示されました。
2009-07-21 09:22:41,018 [main] ERROR - No Persistence provider for EntityManager named agisdb javax.persistence.PersistenceException: No Persistence provider for EntityManager named agisdb at 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
IDE を介して実行している場合、次のような 日食: Project Properties -> Java Build Path -> Libraries.
それ以外の場合は、 /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>
タグをここではからソリューションを取りました
たぶん、あなたは<provider>org.hibernate.ejb.HibernatePersistence</provider>
のような1つのプロバイダを定義したが、瓶に別のものを参照します。それは私と一緒に起こった:私のpersistence.xmlのプロバイダは、OpenJPAのだったが、私は私のクラスパスにでEclipseLinkを使用していました。
このヘルプを願っています!
別のポイントがあります:あなたは、Eclipse RCP環境内で、この問題に直面した場合、あなたはPersistence.createEntityManagerFactory
するnew PersistenceProvider().createEntityManagerFactory
から工場の生成を変更する必要がある場合があります。
このについての詳細な議論については、 ECF を参照してください。
簡単なアドバイス:
- クラスパスに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 が依存関係として含まれていないことがわかりました。
Eclipse を使用している場合は、除外パターンによって削除されないことを確認してください。 persistence.xml
ビルドパス上のソースフォルダーから。
- に行く プロパティ -> Java ビルドパス -> ソース タブ
- 次の場所にある除外パターンを確認してください。
MyProject/src/main/java -> Excluded: <your_pattern>
ツリーノード - 必要に応じて、次のように設定します
Excluded: (None)
ノードを選択してクリックすることにより、 編集... 左側のボタン。
コーナーケース:あなたはm2Eclipseを使用している場合、それは自動的にあなたのリソースフォルダに除外して置きます。あなたは日食の内部テストを実行しようとすると、その後、persistence.xmlのその後の欠如は、このエラーが生成されます。
私は何年か遅れて、ここでパーティにだが、HSQLDBとデスクトップのJavaFXプログラムでの作業3.5.1を休止取得しようとしている間、私は同じ例外をヒット。私はそれがこのスレッドの助けと試行錯誤の多くで動作するようになりました。あなたが問題の全体の様々なためにこのエラーが出るようです。
No Persistence provider for EntityManager named mick
私は、Hibernateチュートリアルの例を構築しようとしたが、私はJavaの10を使用していたので、私は彼らが構築し、簡単に実行するために取得することができませんでした。私は本当に、その問題を修正する時間を無駄にしたくない、それをあきらめました。 module-info.javaファイル(ジグソー)を設定すると、多くの人がまだ発見されていない別の毛玉あります。
やや紛らわしいが、これらは(下)私は私のbuild.gradleファイルに必要な唯一の2つのファイルがあったことです。 Hibernateのドキュメントでは、含める必要があるJARのかを正確にについて明確ではありません。エンティティ・マネージャが混乱を引き起こしていたし、もはや最新のHibernateのバージョンでは必要とされない、そしてどちらのjavax.persistence-APIです。私はいくつかのXML-バインドエラーを回避するだけでなく、私のmodule-info.javaファイル内のJava永続化モジュールのエントリを追加するには、JAXB-APIを含める必要がありましたので、注意が、私はここにJavaの10を使用しています。
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では、あなたのpersistence.xmlファイルで、以下、プロバイダを指定する必要はありません5.3.1。 1が提供されていない場合は、Hibernateのプロバイダがデフォルトで選択されます。
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
persistence.xmlファイルは非常に正しいディレクトリに配置する必要があります:
src/main/resources/META-INF/persistence.xml
が方言をチェックするのIntelliJデバッガにおける休止ソースコードをステップは、またためpersistence.xmlファイル内の欠落方言プロパティの、まったく同じ例外をスローしました。私は、これは(あなたのDBタイプに対して正しいものを追加)を添加します:
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
私はまだ私は(簡単な親子例)を持続しようとしていたテスト実体を明らかにしたので、再びのIntelliJでデバッガをステップ実行、この後に同じ例外が発生しましたOneToManyため行方不明の注釈、ManyToOne関係を持っていました。私はこれを固定し、例外が離れて行って、私のエンティティは、[OK]を持続しました。
ここでは私の完全な最終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つのフィールドを持つ単一のテストエンティティ、この例外は、多くの原因を持つことができるように思えるとして
あなたは「SRC」フォルダの下にpersistence.xmlファイルを作成していることを確認してください。私はプロジェクトフォルダの下に作成し、それは私の問題だった。
これは、エンティティ マネージャーが多くの永続化ユニットをポイントしようとしているときに発生します。次の手順を実行します。
- 関連ファイルをエディタで開きます (プロジェクトが IDE で閉じられている場合)。
- すべての永続性とエンティティ マネージャー関連のコードを削除します。
- ファイルを保存する
- IDE でプロジェクトを開きます
- 次に、選択したデータベースまたはテーブルをバインドします
私も同じ問題に直面しましたが、 EclipseLink バージョン 2.5.0.
私は別のjarファイルを追加することで問題を解決しました。javax.persistence_2.1.0.v201304241213.jar.jar);
必要な瓶:
- javax.persistence_2.1.0.v201304241213.jar
- eclipselink.jar
- jdbc.jar (使用するデータベースに応じて)。
これがお役に立てば幸いです。
私もこのエラーが発生しましたが、問題はpersistence.xml
内の名前空間URIだっます。
Iはhttp://xmlns.jcp.org/xml/ns/persistence
するhttp://java.sun.com/xml/ns/persistence
バージョン2.1から2.0に置き換えます。
今は働いています。
あなたはクラスパスに休止状態-のEntityManager-x.jarを追加する必要があります。
jarファイルが存在する場合は、Hibernateの4.xでは、その後、必要はpersistence.xmlファイルでorg.hibernate.ejb.HibernatePersistenceを追加しないように。
、それはMETA-INFフォルダの適切な場所を見ていないことが考えられます。その他には、フォルダをコピー言及しているが、私のために働いていた別の方法は<resources>
タグを使用して、どこを探す場所をMavenを伝えることでした。参照してください: http://maven.apache.org/プラグイン/ Mavenの資源 - プラグイン/例/リソース-directory.htmlする
質問が既に回答が、ちょうど私を持っていた先端を投稿したかったされています。この例外は、以前のエラーの後に送出されていました。私はこれを得ていた。
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と例外の全体の他の文字列を得ていた非推奨のプロパティ名についてのメッセージを以下に示します。私のヒント:例外ソーセージの始まりを確認してください。
再デプロイまたはアンデプロイとが展開するが、どこかにキャッシュされているのpersistence.xmlを更新していないのGlassFish 2.1.1のバグがあるようです。私は、サーバーを再起動する必要がありましたし、それが働いています。
OSGiのコンテキストでは、バンドルのMANIFEST.MF、例えばであなたの永続性ユニットをリストする必要があります。
JPA-PersistenceUnits: my-persistence-unit
それ以外の場合は、JPA-バンドルは、あなたのバンドルは永続性ユニットが含まれて知ることができません。
http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDEを参照してください。 のます。
クラスパスには次の jar ファイルが必要です。
- antlr-2.7.6.jar
- commons-collections-3.1.jar
- dom4j-1.6.1.jar
- hibernate-commons-annotations-4.0.1.Final.jar
- hibernate-core-4.0.1.Final.jar
- hibernate-entitymanager.jar
- hibernate-jpa-2.0-api-1.0.0.Final.jar
- javassist-3.9.0.jar
- jboss-logging-3.1.1.GA.jar
- jta-1.1.jar
- slf4j-api-1.5.8.jar
- xxx-jdbc-driver.jar
私はちょうどSRCにMETA-INFをコピーして働いていた!
休止状態 5.2.5
Jar ファイル クラスパスに必要です。これは、Hibernate 5.2.5 Final リリースの必須フォルダー内にあります。からダウンロードできます http://hibernate.org/orm/downloads/
- antlr-2.7.7
- cdi-api-1.1
- クラスメイト-1.3.0
- dom4j-1.6.1
- エルAPI-2.2
- geronimo-jta_1.1_spec-1.1.1
- hibernate-commons-annotation-5.0.1.Final
- hibernate-core-5.2.5.Final
- hibernate-jpa-2.1-api-1.0.0.Final
- Jandex-2.0.3.ファイナル
- javassist-3.20.0-GA
- javax.inject-1
- jboss-interceptor-api_1.1_spec-1.0.0.Beta1
- jboss-logging-3.3.0.Final
- jsr250-api-1.0
XMLファイルを作成する 「永続化.xml」 で
YourProject/src/META-INF/persistence.xml
永続性.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>
- <persistance> タグに記載されている情報を書き留めてください。バージョンは 2.1 である必要があります。
- name <persistance-unit> タグに注意してください。名前は次のように記載されています。 "サンプル". 。この名前は、ロード中にまったく同じ名前を使用する必要があります。
EntityManagerFactor = Persistance.createEntityManagerFactory("サンプル");. 。「sample」は命名規則に従って変更できます。
次にEntityクラスを作成します。私の例のUserDetailの名前で、パッケージ内にあります org.pramod.data.object
ユーザー詳細.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
あなたがエラーを取得するよりも、異なるクラスでPersistence.createEntityManagerFactory("JPAService")
で異なる名前がある場合。リファクタリングすることでの私の場合にあったの異なる名前を取得することが可能です。一つのクラス自動生成Persistence.createEntityManagerFactory("JPAService")
in private void initComponents()
において、ContactsTableクラスがDBManagerのクラスにPersistence.createEntityManagerFactory("JPAServiceExtended")
異なっていた。
鉱山は、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>
peristentユニット名を確認してください。
<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**);
私の場合、それは以下のように二つの性質ミスについてでした。私はそれらを変更した場合「という名前のEntityManagerのための持続性なしプロバイダが」disapperedません。
だから、すべてが正しいかどうかを確認するためにあなたの特性とのテスト接続を試みることができる。
<property name="javax.persistence.jdbc.url" value="...”/>
<property name="javax.persistence.jdbc.password" value="...”/>
奇妙なエラー、私はそれのために完全に混乱していた。