web-dev-qa-db-fra.com

Aucun fournisseur de persistance pour EntityManager nommé X

Je développe une application JavaSE utilisant JPA. Malheureusement, je reçois null après avoir appelé: Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

Vous trouverez ci-dessous:

  • Un extrait de mon code qui appelle EntityManagerFactory et renvoie inopinément null
  • Mon fichier persistence.xml
  • Ma structure de projet

Extrait de mon code:

public class Main {
    private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU";
    private static EntityManagerFactory factory;

    public static void main(String[] args) {
        // I get null on this line!!!
       factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

       EntityManager em = factory.createEntityManager();
       // do stuff with entity manager
       ...
    }
}

Mon persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    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">
  <persistence-unit name="MeineJpaPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.Apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>path.to.package.server.Todo</class>
      <exclude-unlisted-classes>false</exclude-unlisted-classes>
     <properties>       
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>       
            <property name="javax.persistence.jdbc.url"  value="jdbc:postgresql://localhost:5432/test"/>       
            <property name="javax.persistence.jdbc.user" value="postgres"/>       
            <property name="javax.persistence.jdbc.password" value="postgres"/>       
        </properties>
  </persistence-unit>
</persistence>

La structure de mon projet:

This is the structure of my project:

12
joshi737

Vous devez déplacer le fichier persistence.xml vers un emplacement approprié.

Plus spécifiquement, ajoutez le fichier META-INF/persistence.xml à la racine d'un dossier source.

Dans ce cas, l'emplacement suivant est approprié: src\main\Java\META-INF\persistence.xml 

Voici les détails: (extrait de la spécification JPA)

Un fichier persistence.xml définit une unité de persistance. Le fichier persistence.xml Le fichier se trouve dans le répertoire META-INF de la racine du fichier unité de persistance.

La racine de l'unité de persistance est la clé ici. 

Si vous êtes un application non-Java EE 

Le fichier ou le répertoire jar dont le répertoire META-INF contient le fichier Le fichier persistence.xml est appelé la racine de l'unité de persistance.

Si vous êtes dans une application Java EE, les éléments suivants sont valides.

Dans les environnements Java EE, la racine d'une unité de persistance doit être l'une des le suivant:

  • un fichier EJB-JAR
  • le répertoire WEB-INF/classes d'un fichier WAR [80]
  • un fichier jar dans le répertoire WEB-INF/lib d'un fichier WAR
  • un fichier jar dans le répertoire de la bibliothèque EAR
  • un fichier jar de client d'application
13
cmd

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, hibernate-entitymanager.jar n'était pas inclus en tant que dépendance, même s'il s'agissait d'une dépendance temporaire d'un autre module.

Voir aussi les réponses ici: Aucun fournisseur de persistance pour EntityManager nommé

11
OndroMih

J'ai récemment mis à niveau NB 8.1 à 8.2 et j'ai soudainement fait face à ce problème et j'ai passé deux jours à résoudre ce problème. Jusqu'à 8.1, la suppression du chemin du processeur (mentionné ci-dessus par d'autres) fonctionnait. Avec 8.2, le problème persiste.

Enfin, j’ai trouvé que le fichier eclipselink.jar est absent de la bibliothèque par défaut d’EclipseLink (JPA 2.1). J'ai ajouté le fichier à la définition de la bibliothèque et le tour est joué - ça a commencé à fonctionner!

1
Prerak Sheth

Si vous ne souhaitez pas déplacer votre dossier META-INF (peut-être parce que c'est là que votre IDE l'a créé et que vous ne voulez pas le confondre), et si vous utilisez Maven, vous pouvez dire à Maven recherchez META-INF à l'aide de la <resources>tag. Voir: http://maven.Apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

Dans ton cas:

<build>
  <resources>
    <resource>
      <directory>src</directory>
    </resource>
  </resources>
</build>
0
esfandia

Donc, dans mon cas, tout était dans le chemin de la classe, mais je devais ajouter

Classe c = Class.forName ("org.Eclipse.persistence.jpa.PersistenceProvider");

Je pense que cela a poussé PersistenceProvider à s'enregistrer auprès des classes javax. J'ai déjà eu à faire quelque chose de similaire pour les pilotes JDBC.

0
RLZaleski

Ne pas expliquer explicitement la dépendance à l'APP 

        <dependency>
                    <groupId>javax.persistence</groupId>
                    <artifactId>persistence-api</artifactId>
                    <version>1.0.2</version>    
      </dependency>

Merci,
Rahul

0
rahulnikhare