web-dev-qa-db-fra.com

javax.persistence.PersistenceException: aucun fournisseur de persistance pour EntityManager nommé customerManager

Je suis nouveau chez JPA & Hibernate. Après avoir lu des documents en ligne, je comprends maintenant ce qu'est Hibernate et comment l'utiliser avec JPA.

Maintenant, j'essaie de lancer ce tutoriel JPA & Hibernate . J'ai fait tout ce qu'ils mentionnent dans ce tutoriel.

Je n'ai pas Oracle DB, seulement MySQL. J'ai donc apporté quelques modifications à persistence.xml en utilisant ma compréhension de JPA et Hibernate (je ne sais pas si c'est correct ou non ... il me semble que c'est le cas.)

Voici mon 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>

Mais je ne semble pas avoir le résultat décrit. Ça me donne:

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)

Toute suggestion sera appréciée.

Mettre à jour:

J'ai apporté les modifications demandées. Mais, toujours obtenir les lignes d'erreur asme !!!

Ils n'ont rien mentionné à propos de orm.xml dans ce tutoriel. que ce soit un problème cause !!!

20
user405398

Votre persistence.xml n'est pas valide et la EntityManagerFactory ne peut pas être créée. CA devrait etre:

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

(Notez comment les éléments <property> sont fermés, ils ne doivent pas être imbriqués)

Mise à jour: J'ai suivi le didacticiel et vous devrez également modifier la stratégie de génération Id lors de l'utilisation de MySQL (car MySQL ne prend pas en charge les séquences). Je suggère d'utiliser la stratégie AUTO (IDENTITY avec MySQL par défaut). Pour ce faire, supprimez l'annotation SequenceGenerator et modifiez le code comme suit:

@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;

   ...
}

Cela devrait aider.

PS: vous devriez également fournir un log4j.properties comme suggéré.

20
Pascal Thivent

Juste pour être complet. Il y a une autre situation qui cause cette erreur: 

mETA-INF/services/javax.persistence.spi.PersistenceProvider manquant fichier.

Pour Hibernate, il se trouve dans hibernate-entitymanager-XXX.jar. Par conséquent, si hibernate-entitymanager-XXX.jar n'est pas dans votre chemin de classe, vous obtiendrez également cette erreur.

Ce message d'erreur est tellement trompeur et cela me coûte des heures pour le corriger.

Voir JPA 2.0 utilisant Hibernate en tant que fournisseur - Exception: aucun fournisseur de persistance pour EntityManager .

25
turtledove

J'ai eu le même problème aujourd'hui. Persistence.xml était au mauvais endroit. Je devais le mettre dans le chemin suivant:

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

Je faisais face au même problème. J'ai réalisé que j'utilisais la classe de fournisseur Wrong dans le fichier persistence.xml.

Pour Hibernate, il devrait être 

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

Et pour EclipseLink, cela devrait être

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

Si vous utilisez Hibernate 5.2.10.Final, vous devriez changer

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

à 

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

dans votre persistence.xml

Selon Hibernate 5.2.2: Aucun fournisseur de persistance pour EntityManager

2
Justas

Si vous utilisez Maven, vous pouvez avoir les deux src/{main,test}/resources/META-INF/persistence.xml. Il s'agit d'une configuration courante: testez votre code JPA avec h2 ou Derby et déployez-le avec PostgreSQL ou un autre SGBD complet. Si vous utilisez ce modèle, assurez-vous que les noms de deux fichiers sont différents sinon certaines versions de la classe Persistence essaieront de charger BOTH (car bien sûr, votre test CLASSPATH inclut les deux classes et Des classes); cela entraînera des définitions contradictoires de l'unité de persistance, ce qui produira le terrible message ennuyeux que nous détestons tous autant!

Pire: cela peut "fonctionner" avec certaines versions plus anciennes d'Hibernate, par exemple, mais échouer avec les versions actuelles. Ça vaut le coup d'y aller quand même ...

1
idarwin

Un peu trop tard mais j'ai eu le même problème et je l'ai corrigé en commutant schemalocation dans schemaLocation dans le fichier persistence.xml (ligne 1).

0
Nicolas Landier

J'étais également confronté au même problème lorsque j'essayais de configurer le gestionnaire d'entités JPA dans Tomcat 8. Premièrement, j'ai un problème avec la classe SystemException non trouvée et par conséquent, le entityManagerFactory n'était pas créé. J'ai supprimé la dépendance du gestionnaire d'entités hibernate et mon entityManagerFactory n'a pas été en mesure de rechercher le fournisseur de persistance. Après de nombreuses recherches et du temps, nous avons appris que le gestionnaire d’entités en veille prolongée est indispensable pour la recherche d’une configuration. Remettez ensuite le fichier jar du gestionnaire d’entités, puis ajoutez JTA Api en tant que dépendance et tout fonctionnera bien.

0

J'ai vu cette erreur, pour moi le problème était qu'il y avait un espace dans le chemin absolu de la persistance.xml, la suppression de la même m'a aidé.

0
Raja