Aucun fournisseur de persistance pour EntityManager nommé
J'ai ma persévérance.xml avec le même nom, en utilisant toplink, sous le répertoire META-INF. Ensuite, j'ai mon code qui l'appelle avec:
EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");
Pourtant, j'ai reçu le message d'erreur suivant
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)
Voici la persistance.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>
Il aurait dû être dans le classpath. Pourtant, j'ai l'erreur ci-dessus.
25 réponses
Après <persistence-unit name="agisdb">
, Définissez le nom du fournisseur de persistance:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
Mettre les "hibernate-entitymanager.jar"
dans le classpath de l'application.
Pour les versions plus récentes, vous devez utiliser "hibernate-core.jar"
au lieu de hibernate-entitymanager
Si vous utilisez un IDE, comme Eclipse: Project Properties -> Java Build Path -> Libraries.
Sinon mettez-le dans le /lib
de votre application.
Assurez-vous que le persistence.xml
fichier est dans le répertoire: <webroot>/WEB-INF/classes/META-INF
J'en avais besoin dans mon pom.fichier xml:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.6.Final</version>
</dependency>
A fait 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
Peut-être avez-vous défini un fournisseur comme <provider>org.hibernate.ejb.HibernatePersistence</provider>
mais en référençant un autre dans jar. C'est arrivé avec moi: ma persistance.le fournisseur xml était openjpa mais j'utilisais eclipselink dans mon classpath.
Espérons que cette aide!
Il y a un autre point: si vous rencontrez ce problème dans un environnement Eclipse RCP, vous devrez peut-être changer la génération D'usine de Persistence.createEntityManagerFactory
à new PersistenceProvider().createEntityManagerFactory
Voir ECF pour une discussion détaillée à ce sujet.
Conseils Rapides:
- Vérifiez si la persistance.xml est dans votre classpath
- Vérifiez 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 être fait de deux façons que je connais:
- ajoutez un élément provider dans l'Unité de persistance:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
(comme décrit dans la réponse correcte de Chris: https://stackoverflow.com/a/1285436/784594) - ou fournisseur pour l'interface javax.persistance.le spi.PersistenceProvider doit être spécifié en tant que service, voir ici: http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html (ceci est généralement inclus lorsque vous incluez hibernate, ou une autre implémentation JPA, dans votre classpath
Dans mon cas, j'ai découvert qu'en raison d'une mauvaise configuration de maven, hibernate-entitymanager jar n'était pas inclus en tant que dépendance, même si c'était une dépendance transitoire d'un autre module.
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 construction.
- allez dans propriétés - > chemin de construction Java - > source tab
- vérifiez votre modèle d'exclusion qui se trouve à
MyProject/src/main/java -> Excluded: <your_pattern>
noeud d'arbre - Éventuellement, mettre
Excluded: (None)
en sélectionnant le nœud et en cliquant sur Modifier... bouton sur la gauche.
Corner case: si vous utilisez m2Eclipse, il place automatiquement les exclusions sur vos dossiers de ressources. Ensuite, lorsque vous essayez d'exécuter des tests dans eclipse, l'absence subséquente de persistance.xml produira cette erreur.
Assurez-vous que vous avez créé la persistance.fichier xml sous le dossier' src'. J'ai créé sous le dossier du projet et c'était mon problème.
Cela se produit lorsque le gestionnaire d'entité essaie de pointer vers de nombreuses unités de persistance. Procédez comme suit:
- Ouvrez le fichier associé dans votre éditeur (à condition que votre projet ait été fermé dans votre IDE)
- supprime tout le code associé à la persistance et au gestionnaire d'entités
- Enregistrer le fichier
- Ouvrez le projet dans votre IDE
- maintenant, liez la base de données ou la table de votre choix
J'ai rencontré le MÊME PROBLÈME, MAIS sur EclipseLink version 2.5.0 .
J'ai résolu mon problème en ajoutant encore un autre fichier jar qui était nécessairement (javax.persistence_2.1.0.v201304241213.pot.pot);
Pots nécessaires:
- javax.persistence_2.1.0.v201304241213.jar
- eclipselink.jar
- jdbc.jar (en fonction de la base de données utilisée).
J'espère que cela aide.
, j'ai aussi eu cette erreur mais le problème est l'uri d'espace de noms dans le persistence.xml
.
J'ai remplacé http://xmlns.jcp.org/xml/ns/persistence
à http://java.sun.com/xml/ns/persistence
et la version 2.1 à 2.0.
Ça marche maintenant.
Vous devez ajouter le hibernate-entitymanager-x.jar dans le classpath.
Dans Hibernate 4.x, si le pot est présent, alors pas besoin d'ajouter de l'org.hiberner.ejb.HibernatePersistence dans la persistance.fichier xml.
La question a déjà été répondue, mais je voulais juste poster un pourboire qui me retenait. Cette exception a été levée après des erreurs précédentes. Je recevais ceci:
property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.
Même si j'avais changé la persistance.xml pour inclure le nouveau nom de propriété:
<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>
Suite au message sur le nom de propriété obsolète, j'obtenais la même PersistenceException comme 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 bug dans Glassfish v2.1.1 où les redéploiements ou les undeploys et les déploiements ne mettent pas à jour la persistance.xml, qui est mis en cache quelque part. J'ai dû redémarrer le serveur, puis cela a fonctionné.
Dans un contexte OSGi, il est nécessaire de lister vos unités de persistance dans le Manifeste du bundle.MF, par exemple
JPA-PersistenceUnits: my-persistence-unit
Sinon, le bundle JPA ne saura pas que votre bundle contient des unités de persistance.
Voir http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE .
Vous avez besoin des fichiers jar suivants dans le classpath:
- 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-version 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.pot
- xxx-JDBC-pilote.jar
Je viens de copier le META-INF dans src et j'ai travaillé!
Hiberner 5.2.5
Fichiers Jar requis dans le chemin de la classe. Ceci est dans un dossier requis de Hibernate 5.2.5 version finale. Il peut être téléchargé à partir de http://hibernate.org/orm/downloads/
- antlr-2.7.7
- cdi-api 1.1
- camarade de classe-1.3.0
- dom4j-1.6.1
- El-api-2.2
- geronimo-jta_1. 1_spec-1.1.1
- hibernate-commons-annotation-5.0.1.Finale
- hibernate-core-5.2.5.Finale
- hibernate jpa-2.1-api-version 1.0.0.Finale
- jandex-2.0.3.Finale
- javassist-3.20.0-GA
- javax.injecter-1
- JBoss-interceptor-api_1. 1_spec-1.0.0.Beta1
- JBoss-logging-3.3.0.Finale
- jsr250-api-1.0
Créer un fichier xml fichier "persistance.xml" dans
Votreprojet/src/META-INF/persistance.xml
Persistance.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>
- Veuillez noter que les informations mentionnées dans la balise et la version doivent être 2.1.
- veuillez noter que le nom balise, le nom est mentionné comme "échantillon". Ce nom doit être utilisé exactement de la même manière lors du chargement de votre
EntityManagerFactor = La Persistance.createEntityManagerFactory("exemple");. "sample" peut être modifié selon votre convention de nommage.
Créez maintenant une classe D'entité. avec le nom selon mon exemple UserDetail, dans le paquet org.pramod.données.objet
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 + "]";
}
}
Créez maintenant une classe avec la méthode principale.
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
Si vous utilisez Maven, il se peut qu'il ne regarde pas au bon endroit pour le dossier META-INF. D'autres ont mentionné la copie du dossier, mais une autre façon qui a fonctionné pour moi était de dire à Maven où le chercher, en utilisant la balise <resources>
. Voir: http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
Je suis quelques années en retard à la fête ici mais j'ai frappé la même exception en essayant D'obtenir Hibernate 3.5.1 travailler avec HSQLDB et un programme JavaFX de bureau. Je l'ai eu à travailler avec l'aide de ce fil et beaucoup d'essais et d'erreurs. Il semble que vous obtenez cette erreur pour toute une variété de problèmes:
No Persistence provider for EntityManager named mick
J'ai essayé de construire les exemples du tutoriel hibernate mais parce que J'utilisais Java 10, Je n'ai pas pu les construire et les exécuter facilement. J'ai renoncé à cela, ne voulant pas vraiment perdre de temps résoudre ses problèmes. Configuration d'un module-info.fichier java (Jigsaw) est une autre boule de poils beaucoup de gens n'ont pas encore découvert.
Un peu déroutant est que ceux-ci (ci-dessous) étaient les deux seuls fichiers dont j'avais besoin dans ma construction.fichier gradle. La documentation Hibernate n'est pas claire sur les Jars que vous devez inclure. Entity-manager causait de la confusion et n'est plus nécessaire dans la dernière version D'Hibernate, et javax non plus.la persistance de l'api. Note, j'utilise Java 10 ici donc je devais incluez l'api JAXB, pour contourner certaines erreurs xml-bind, ainsi que pour ajouter une entrée pour le module de persistance java dans mon module-info.fichier java.
Construire.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 persistance.fichier xml. Si l'un N'est pas fourni, le fournisseur Hibernate est choisi par défaut.
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
La persistance.xml fichier doit être situé dans le répertoire correct donc:
src/main/resources/META-INF/persistence.xml
Parcourir le code source hibernate dans le débogueur Intellij, où il vérifie un dialecte, a également jeté la même exception exacte, en raison d'une propriété dialecte manquante dans la persistance.fichier xml. J'ai ajouté ceci (ajoutez le bon 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, donc en parcourant à nouveau le débogueur dans Intellij, j'ai révélé que l'entité de test que j'essayais de persister (exemple simple parent-enfant) avait des annotations manquantes pour l'OneToMany, ManyToOne relations. J'ai corrigé cela et l'exception a disparu et mes entités ont été persistées ok.
Voici ma persistance finale complète.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>
J'ai probablement perdu environ une demi-journée sur ce 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 de nombreuses causes.
S'il y a des noms différents dans Persistence.createEntityManagerFactory("JPAService")
dans différentes classes que vous obtenez l'erreur. en refactorisant il est possible d'obtenir différents noms ce qui était dans mon cas. Dans une classe, la Persistence.createEntityManagerFactory("JPAService")
générée automatiquement dans private void initComponents()
, La classe ContactsTable différait de Persistence.createEntityManagerFactory("JPAServiceExtended")
dans la classe DBManager.
Le mien a été résolu en ajoutant des informations dans la persistance.xml par exemple <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
, puis en vous assurant que vous avez la bibliothèque sur classpath par exemple dans Maven add dependency comme
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.0</version>
</dependency>
Vérifiez le nom de l'unité péristante
<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**);