“Aucun fournisseur de Persistance pour l'EntityManager” erreur
Je suis novice pour JPA, et j'ai essayé de faire un simple exemple dans le livre.
Mais peu importe ce que je fais, je reçois l'erreur suivante:
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named EmployeeService
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
at com.mycompany.simpleentity.EmployeeTest.main(EmployeeTest.java:18)
J'ai googlé beaucoup et j'ai fait tout ce que j'ai lu sur la JPA.
Voici un répertoire de l'arborescence de mon projet:
.
|-- pom.xml
`-- src
|-- main
| |-- java
| | `-- com
| | `-- mycompany
| | `-- simpleentity
| | |-- Employee.java
| | |-- EmployeeService.java
| | `-- EmployeeTest.java
| `-- resources
| `-- META-INF
| `-- persistence.xml
`-- test
Voici mon pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>SimpleEntity</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SimpleEntity</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.0-801.jdbc4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.simpleentity.EmployeeTest</mainClass>
<!-- <classpathLayoutType>repository</classpathLayoutType> -->
<classpathMavenRepositoryLayout>true</classpathMavenRepositoryLayout>
<classpathPrefix>${env.HOME}/.m2/repository</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
Voici mon code source:
EmployeeTest.java:
package com.mycompany.simpleentity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class EmployeeTest {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeeService");
EntityManager em = emf.createEntityManager();
}
}
Et voici mon persistance.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="EmployeeService" transaction-type="RESOURCE_LOCAL">
<class>com.mycompany.simpleentity.Employee</class>
<properties>
<property name="toplink.jdbc.driver"
value="org.postgresql.Driver"/>
<property name="toplink.jdbc.url"
value="jdbc:postgresql://localhost:5432/testdb;create=true"/>
<property name="toplink.jdbc.user" value="postgres"/>
<property name="toplink.jdbc.password" value="111"/>
</properties>
</persistence-unit>
</persistence>
Que dois-je faire de mal?
Je vous remercie à l'avance.
Vous devez vous connecter pour publier un commentaire.
JPA est une spécification de mise en œuvre par plusieurs fournisseurs JPA. (Hibernate, EclipseLink, OpenJPA, Toplink).
Vous devez choisir un fournisseur à utiliser et ajouter les dépendances de votre
pom.xml
. Aussi, vous devez spécifier votre fournisseur depersistence.xml
.Par exemple, si vous utilisez OpenJPA (j'ai choisi pour cet exemple, depuis sa dernière version est disponible dans le Repo Maven Central, donc il n'est pas nécessaire de configurer le fournisseur des référentiels spécifiques):
.
si vous utilisez JPA + eclipselink Fournisseur que l'utilisation de ce code
1) assurez-vous que vous avez défini le fournisseur de persistance(pour le fournisseur):
Ex Pour openjpa:
<persistence-unit ...>
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
...
...
</persistence-unit>
2) si vous utilisez la version personnalisée/processus de compilation (maven, etc)
assurez-vous que votre Meta-INF/persistance.xml est copié dans le compilées/dossier classes.
En fait,
Vous ne semblez pas avoir une dépendance réelle Peristence Fournisseur.
JPA en elle-même ne dispose pas d'une mise en œuvre, vous devez également utiliser Hibernate/Toplink/OpenJPA comme une solution réelle.
Selon votre persistence.xml vous êtes à l'aide de TopLink avec PostgreSQL comme SGBD. Alors que vous faites référence à l'PostgreSQL pilote JDBC dans votre pom.xml vous n'avez pas déclaré TopLink comme une dépendance.
Je pense (je l'avoue), c'est que la persistance de l'API ne trouve pas de TopLink (votre fournisseur de persistance) dans le classpath. Essayez d'ajouter TopLink comme une dépendance.
JPA étant une spécification a de multiples fournisseurs (réalisateurs). Vous devez choisir celui qui vous donne la bytecode pour la spécification JPA. Hibernate est choix commun, mais le vôtre peut être différent. Une fois que vous avez identifié que, ajoutez-le en tant que dépendance dans votre POM. Sinon, ajoutez le fichier JAR de votre build path.