web-dev-qa-db-fra.com

Aucun fournisseur de persistance pour EntityManager nommé

J'ai persistence.xml avec le même nom, en utilisant toplink, dans le répertoire META-INF . Ensuite, mon code l'appelle avec:

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

Pourtant, j'ai le message d'erreur suivant

 2009-07-21 09: 22: 41,018 [main] ERROR - Aucun fournisseur de persistance pour EntityManager nommé agisdb 
 Javax.persistence.PersistenceException: aucun fournisseur de persistance pour EntityManager nommé agisdb 
 à l'adresse javax.persistence.Persistence.createEntityManagerFactory (Persistence.Java:89) 
 at javax.persistence.Persistence.createEntityManagerFactory (Persistence.Java:60) 

Voici le fichier 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>

Cela aurait dû être dans le classpath. Pourtant, j'ai l'erreur ci-dessus.

132
Robert A Henru

Après <persistence-unit name="agisdb">, définissez le nom du fournisseur de persistance:

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

Placez le "hibernate-entitymanager.jar" dans le classpath de l'application.
Pour les versions plus récentes, vous devez utiliser "hibernate-core.jar" au lieu du hibernate-entitymanager, obsolète.

Si vous utilisez un IDE, comme Eclipse : Project Properties -> Java Build Path -> Libraries. 

Sinon, mettez-le dans le /lib de votre application.

85
Ualter Jr.

Assurez-vous que le fichier persistence.xml se trouve dans le répertoire: <webroot>/WEB-INF/classes/META-INF 

65
user225932

J'avais besoin de cela dans mon fichier pom.xml:

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

Face au même problème et n'a pas pu trouver de solution pendant assez longtemps. Dans mon cas, cela a aidé à remplacer

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

avec

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

A pris la solution de ici

13
Sneg

Peut-être avez-vous défini un fournisseur comme <provider>org.hibernate.ejb.HibernatePersistence</provider> mais en référant un autre dans jar. Cela m'est arrivé: mon fournisseur persistence.xml était openjpa mais j'utilisais eclipselink dans mon chemin de classe . J'espère que cela vous aidera!

9
Gilberto

Il existe un autre point: si vous rencontrez ce problème dans un environnement Eclipse RCP, vous devrez peut-être modifier la génération d’usine de Persistence.createEntityManagerFactory à new PersistenceProvider().createEntityManagerFactory.

voir ECF pour une discussion détaillée à ce sujet.

9
col.panic

Conseil rapide:

  • vérifie si persistence.xml est dans votre chemin de classe
  • vérifie si le fournisseur hibernate est dans votre classpath

Avec l'utilisation de JPA dans une application autonome (en dehors de JavaEE), un fournisseur de persistance doit être spécifié quelque part. Cela peut se faire de deux manières que je connaisse:

Dans mon cas, j'ai découvert qu'en raison d'une mauvaise configuration de Maven, le fichier jar de hibernate-entitymanager n'était pas inclus en tant que dépendance, même s'il s'agissait d'une dépendance transitoire d'un autre module.

7
OndroMih

Si vous utilisez Eclipse, assurez-vous que le modèle d'exclusion ne supprime pas votre persistence.xml des dossiers source sur le chemin de génération.

  1. Allez dans Propriétés -> Chemin de construction Java -> Source onglet
  2. Vérifiez votre modèle d'exclusion qui est situé à
    MyProject/src/main/Java -> Excluded: <your_pattern>
    noeud d'arbre
  3. Si vous le souhaitez, définissez-le sur Excluded: (None) en sélectionnant le nœud et en cliquant sur le bouton Modifier ... à gauche.
5
wypieprz

Cas d'école: si vous utilisez m2Eclipse, les dossiers de ressources sont automatiquement exclus. Ensuite, lorsque vous essayez d'exécuter des tests dans Eclipse, l'absence ultérieure de persistence.xml générera cette erreur.

4
Rob

Je suis arrivé avec quelques années de retard à la soirée ici, mais je rencontre la même exception en essayant de faire fonctionner Hibernate 3.5.1 avec HSQLDB et un programme JavaFX de bureau. Je l'ai fait fonctionner avec l'aide de ce fil et beaucoup d'essais et d'erreurs. Il semble que vous obtenez cette erreur pour toute une série de problèmes:

No Persistence provider for EntityManager named mick

J'ai essayé de construire les exemples de didacticiel d'hibernation, mais, étant donné que j'utilisais Java 10, je ne pouvais pas les créer et les exécuter facilement. J'ai abandonné cela, ne voulant pas perdre de temps à régler ses problèmes. Configurer un fichier module-info.Java (Jigsaw) est une autre boule de poils que beaucoup de gens n'ont pas encore découverte.

Ce qui est un peu déroutant, c’est que ce sont (ci-dessous) les deux seuls fichiers dont j’avais besoin dans mon fichier build.gradle. La documentation d'Hibernate ne précise pas exactement quels fichiers JAR vous devez inclure. Entity-manager était source de confusion et n'est plus requis dans la dernière version d'Hibernate, pas plus que javax.persistence-api. Notez que j'utilise Java 10 ici, donc je devais inclure jaxb-api pour éviter certaines erreurs de liaison xml, ainsi que pour ajouter une entrée pour le module de persistance Java dans mon fichier module-info.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;

Avec hibernate 5.3.1, vous n'avez pas besoin de spécifier le fournisseur, ci-dessous, dans votre fichier persistence.xml. Si aucun n'est fourni, le fournisseur Hibernate est choisi par défaut.

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

Le fichier persistence.xml doit être situé dans le bon répertoire pour:

src/main/resources/META-INF/persistence.xml

En parcourant le code source d'hibernation dans le débogueur Intellij, où il recherche un dialecte, il a également lancé la même exception en raison d'une propriété de dialecte manquante dans le fichier persistence.xml. J'ai ajouté ceci (ajoutez le correct pour votre type de base de données):

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

J'ai toujours eu la même exception après cela, aussi, parcourant à nouveau le débogueur dans Intellij a révélé que l'entité de test que je tentais de conserver (exemple parent-enfant simple) manquait d'annotations pour les relations OneToMany, ManyToOne. J'ai corrigé ceci et l'exception est partie et mes entités ont persisté, ok.

Voici mon persistence.xml final complet:

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

J'ai probablement perdu environ une demi-journée sur ce petit bijou. Mon conseil serait de commencer très simple - une seule entité de test avec un ou deux champs, car il semble que cette exception puisse avoir plusieurs causes.

3
MickG

Assurez-vous d'avoir créé le fichier persistence.xml dans le dossier 'src'. J'ai créé sous le dossier du projet et c'était mon problème.

3
harcharan

Vous devez ajouter le fichier hibernate-entitymanager-x.jar dans le chemin d'accès aux classes.

Dans Hibernate 4.x, si le fichier jar est présent, inutile d'ajouter le fichier org.hibernate.ejb.HibernatePersistence dans le fichier persistence.xml.

2
vijayinani

Cela se produit lorsque le responsable d'entité essaie de pointer vers de nombreuses unités de persistance. Effectuez les étapes suivantes:

  1. ouvrez le fichier correspondant dans votre éditeur (à condition que votre projet ait été fermé dans votre IDE)
  2. supprimer tout le code associé à la persistance et au gestionnaire d'entités
  3. sauvegarder le fichier
  4. ouvrez le projet dans votre IDE
  5. maintenant lier la base de données ou la table de votre choix
2
mahesh

J'ai rencontré le même problème, mais sur EclipseLink version 2.5.0 .

J'ai résolu mon problème en ajoutant un autre fichier JAR qui était nécessairement (javax.persistence_2.1.0.v201304241213.jar.jar);

Bocaux nécessaires:
- javax.persistence_2.1.0.v201304241213.jar
- eclipselink.jar
- jdbc.jar (selon la base de données utilisée).

J'espère que ça aide.

2
E_X

Si vous utilisez Maven, il se peut que le dossier META-INF ne soit pas placé au bon endroit. D'autres ont mentionné la copie du dossier, mais une autre façon qui a fonctionné pour moi était de dire à Maven où le rechercher, à l'aide de la balise <resources>. Voir: http://maven.Apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

2
esfandia

J'ai également eu cette erreur, mais le problème était l'espace de noms uri dans le persistence.xml.

J'ai remplacé http://xmlns.jcp.org/xml/ns/persistence par http://Java.Sun.com/xml/ns/persistence et la version 2.1 à 2.0.

Cela fonctionne maintenant.

2
Ludovic Guillaume

Je viens de copier le META-INF dans src et j'ai travaillé!

1
Zakaria Bouazza

Vous avez besoin des fichiers JAR suivants dans le chemin de classe:

  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

On a déjà répondu à la question, mais je voulais simplement publier un conseil qui me tenait debout. Cette exception a été levée après des erreurs précédentes. Je devenais ceci:

property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.

Même si j'avais changé le fichier persistence.xml pour inclure le nouveau nom de la propriété:

<property name="toplink.target-database" value="Oracle.toplink.platform.database.Oracle.Oracle10Platform"/>

Après le message relatif au nom de la propriété déconseillée, je recevais la même exception PersistenceException que ci-dessus et toute une autre chaîne d’exceptions. Mon conseil: assurez-vous de vérifier le début de la saucisse d'exception.

Il semble y avoir un bogue dans Glassfish 2.1.1 où les redéploiements, les désinstallations et les déploiements ne mettent pas à jour le fichier persistence.xml, qui est mis en cache quelque part. Je devais redémarrer le serveur et puis cela a fonctionné.

1

Hibernate 5.2.5
Fichiers Jar Requis dans le chemin de classe. Cela se trouve dans un dossier requis de la version finale d'Hibernate 5.2.5. Il peut être téléchargé à partir de http://hibernate.org/orm/downloads/

  1. antlr-2.7.7 
  2. cdi-api-1.1 
  3. camarade de classe-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.Final
  8. hibernate-core-5.2.5.Final
  9. hibernate-jpa-2.1-api-1.0.0.Final
  10. jandex-2.0.3.Final
  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.Final
  15. jsr250-api-1.0

Créez un fichier XML "persistence.xml" dans 

VotreProjet/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. veuillez noter les informations mentionnées dans la balise <persistance> et la version doit être 2.1.
  2. veuillez noter la balise name <persistance-unit>, le nom est mentionné comme "échantillon". Ce nom doit être utilisé exactement lors du chargement de votre 

EntityManagerFactor = Persistance.createEntityManagerFactory ("exemple"); "échantillon" peut être modifié selon votre convention de dénomination.

Maintenant, créez une classe d'entité. avec le nom selon mon exemple UserDetail, dans le package 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 + "]";
    }
}

Maintenant, créez une classe avec la méthode 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();
        }

    }

}

La sortie sera

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

Dans un contexte OSGi, il est nécessaire de répertorier vos unités de persistance dans MANIFEST.MF du bundle, par exemple.

JPA-PersistenceUnits: my-persistence-unit

Sinon, le paquet JPA ne saura pas que votre paquet contient des unités de persistance.

Voir http://wiki.Eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE .

1
schieferstapel

Le mien a été résolu en ajoutant des informations dans persistence.xml, par exemple. <provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider> et ensuite vous assurer que vous avez la bibliothèque sur classpath, par exemple. dans Maven ajouter une dépendance comme

<dependency>
  <groupId>org.Eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.5.0</version>
</dependency>
0
Dhwaneel

S'il existe différents noms dans Persistence.createEntityManagerFactory("JPAService") dans différentes classes, l'erreur est générée. En refacturant, il est possible d'obtenir différents noms ce qui était dans mon cas. Dans une classe, la fonction Persistence.createEntityManagerFactory("JPAService")in__inprivate void initComponents(), générée automatiquement, de la classe ContactsTable était différente de Persistence.createEntityManagerFactory("JPAServiceExtended") dans la classe DBManager.

0
burseaner

Dans mon cas, il s'agissait d'une erreur dans deux propriétés comme ci-dessous. Quand je les ai changés, ‘Le fournisseur No Persistence pour EntityManager nommé’ a disparu.

Vous pouvez donc essayer de tester la connexion avec vos propriétés pour vérifier si tout est correct.

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

Erreur étrange, j'ai été totalement confus à cause de cela.

0
Wojtek Piróg

Vérifier le nom de l'unité permanente

<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