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:
EntityManagerFactory
et renvoie inopinément null
persistence.xml
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:
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
Conseil rapide:
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:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
(comme décrit dans la réponse correcte de Chris ici: https://stackoverflow.com/a/1285436/784594 )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é
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!
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>
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.
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