web-dev-qa-db-ja.com

javax.persistence.PersistenceException:customerManagerという名前のEntityManagerの永続プロバイダーはありません

JPAとHibernateは初めてです。いくつかのオンライン資料を読んだ後、Hibernateとは何か、JPAでHibernateを使用する方法を理解しました。

今、私はこれを実行しようとしています JPA&Hibernate tutorial 。私は彼らがこのチュートリアルで言及するすべてをしました。

Oracle DBはなく、MySQLしかありません。それで、JPAとHibernateの理解を使ってpersistence.xmlにいくつかの変更を加えました(それが正しいかどうかはわかりません...どうやらそうです。)

これが私のpersistence.xmlです

<persistence 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" version="1.0">
  <persistence-unit name="customerManager" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>Customer</class>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.connection.username" value="root"/>
      <property name="hibernate.connection.password" value="1234"/>
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
    </properties>
  </persistence-unit>
</persistence>

しかし、私は彼らが説明する出力を取得していないようです。それは私に与えています:

Customer id before creation:null
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" javax.persistence.PersistenceException: No Persistence     provider for EntityManager named customerManager
 at javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:55)
 at javax.persistence.Persistence.createEntityManagerFactory(Persistence.Java:33)
 at CustomerDAO.create(CustomerDAO.Java:8)
 at CustomerDAO.main(CustomerDAO.Java:22)

あらゆる提案を歓迎します。

更新:

私は行うように求められている変更を加えました。しかし、まだasmeエラー行が表示されます!!!

彼らはそのチュートリアルでorm.xmlについて何も言及していませんでした。問題の原因かもしれません!!!

20
user405398

persistence.xmlは無効であり、EntityManagerFactoryを作成できません。そのはず:

<persistence 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" version="1.0">
  <persistence-unit name="customerManager" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>Customer</class>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.connection.username" value="root"/>
      <property name="hibernate.connection.password" value="1234"/>
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
    </properties>
  </persistence-unit>
</persistence>

<property>要素がどのように閉じられるかに注意してください、それらはネストされてはいけません

更新:チュートリアルを進めましたが、MySQLを使用する場合はId生成戦略も変更する必要があります(MySQLはシーケンスをサポートしないため)。 AUTO戦略(デフォルトではMySQLのIDENTITY)を使用することをお勧めします。これを行うには、SequenceGenerator注釈を削除し、次のようにコードを変更します。

@Entity
@Table(name="TAB_CUSTOMER")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="CUSTOMER_ID", precision=0)
    private Long customerId = null;

   ...
}

これが役立つはずです。

PS:提案どおりlog4j.propertiesも提供する必要があります。

19
Pascal Thivent

完全を期すためだけに。このエラーを引き起こす別の状況があります:

mETA-INF/services/javax.persistence.spi.PersistenceProviderファイルがありません。

Hibernateの場合、hibernate-entitymanager-XXX.jar、したがって、hibernate-entitymanager-XXX.jarはクラスパスにありません。このエラーも発生します。

このエラーメッセージは非常に誤解を招くものであり、修正するには数時間かかります。

プロバイダーとしてHibernateを使用するJPA 2.0-例外:EntityManagerの永続プロバイダーなし を参照してください。

25
turtledove

今日も同じ問題がありました。 persistence.xmlが間違った場所にありました。次のパスに配置する必要がありました。

project/src/main/resources/META-INF/persistence.xml
17
Dan Torrey

私は同じ問題に直面していました。 persistence.xmlで間違ったプロバイダークラスを使用していることに気付きました

Hibernateの場合は、

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

EclipseLinkの場合は

<provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider>
10
Vivek

Hibernate 5.2.10.Finalを使用する場合は、変更する必要があります

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

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

persistence.xmlで

Hibernate 5.2.2:EntityManagerの永続プロバイダーなし

2
Justas

Mavenを使用している場合、bothsrc/{main,test}/resources/META-INF/persistence.xml。これは一般的なセットアップです。h2またはDerbyでJPAコードをテストし、PostgreSQLまたはその他の完全なDBMSでデプロイします。このパターンを使用している場合、2つのファイルにdifferentユニット名が含まれていることを確認してください。そうしないと、Persistenceクラスの一部のバージョンが両方をロードしようとします(もちろん、 time CLASSPATHにはクラスとテストクラスの両方が含まれます);これは、永続性ユニットの矛盾する定義を引き起こし、その結果、私たち全員が大いに嫌う恐ろしい迷惑なメッセージをもたらします!

さらに悪いことに、これは、Hibernateなどの一部の古いバージョンでは「機能する」可能性がありますが、現在のバージョンでは失敗します。とにかくそれを正しくする価値がある...

1
idarwin

少し遅すぎましたが、同じ問題が発生し、persistence.xmlファイル(行1)でschemalocationschemaLocationに切り替えて修正しました。

0
Nicolas Landier

Tomcat 8でJPAエンティティマネージャーを構成しようとしたときにも同じ問題に直面していました。最初にSystemExceptionクラスが見つからないという問題があり、entityManagerFactoryが作成されていませんでした。 hibernateエンティティマネージャーの依存関係を削除した後、entityManagerFactoryが永続化プロバイダーを検索できませんでした。多くの調査を経て、Hibernateエンティティマネージャーが何らかの構成を検索する必要があることを知るようになりました。次に、エンティティマネージャjarを戻し、JTA Apiを依存関係として追加しましたが、正常に機能しました。

私はこのエラーを見ました、私にとって問題はpersistance.xmlの絶対パスにスペースがあったということで、同じものを取り除くことは私を助けました。

0
Raja