2010-11-23 5 views
5

Ich bin Neuling zu JPA und ich versuchte, ein einfaches Beispiel aus dem Buch zu tun. Aber egal was ich tue, erhalte ich folgende Fehlermeldung:"Kein Persistence Provider für EntityManager" Fehler

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) 

gegoogelt ich viel, und ich habe alles, was ich über JPA lesen.
Hier ist ein Verzeichnisbaum meines Projekts:

. 
|-- pom.xml 
`-- src 
    |-- main 
    | |-- java 
    | | `-- com 
    | |  `-- mycompany 
    | |   `-- simpleentity 
    | |    |-- Employee.java 
    | |    |-- EmployeeService.java 
    | |    `-- EmployeeTest.java 
    | `-- resources 
    |  `-- META-INF 
    |   `-- persistence.xml 
    `-- test 

Hier mein pom.xml ist:

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

Hier ist meine Quellcode: 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(); 

    } 
} 

Und hier ist meine 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> 

Was mache ich falsch? Vielen Dank im Voraus. Eigentlich

Antwort

7

JPA ist eine Spezifikation, die von mehreren JPA-Providern (Hibernate, EclipseLink, OpenJPA, Toplink) implementiert wird.

Sie müssen einen Anbieter auswählen und die entsprechende Abhängigkeit zu Ihrer pom.xml hinzufügen. Außerdem müssen Sie Ihren Provider in persistence.xml angeben.

Zum Beispiel, wenn Sie OpenJPA verwenden (I choosed es für dieses Beispiel, da seine neueste Version in Maven Zentral Repo zur Verfügung steht, so gibt es keine Notwendigkeit herstellerspezifischen Repositorys zu konfigurieren):

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- Note that you don't need persistence-api dependency - it's transitive --> 
    <dependency> 
     <groupId>org.apache.openjpa</groupId> 
     <artifactId>openjpa-all</artifactId> 
     <version>2.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.0-801.jdbc4</version> 
    </dependency> 
    </dependencies> 

.

<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"> 
     <!-- Provider specification --> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 

     <class>com.mycompany.simpleentity.Employee</class>  
     <properties>  
      <property name="javax.persistence.jdbc.driver"  
         value="org.postgresql.Driver"/>  
      <property name="javax.persistence.jdbc.url"  
         value="jdbc:postgresql://localhost:5432/testdb;create=true"/>  
      <property name="javax.persistence.jdbc.user" value="postgres"/>  
      <property name="javax.persistence.jdbc.password" value="111"/>  

     </properties>  
    </persistence-unit>  
</persistence> 
1

,

Sie scheinen nicht eine Abhängigkeit für eine tatsächliche Peristence Provider zu haben.

JPA selbst hat keine Implementierung, Sie müssen Hibernate/Toplink/OpenJPA auch als tatsächliche Lösung verwenden.

0

Entsprechend Ihrer persistence.xml verwenden Sie TopLink mit PostgreSQL als RDBMS. Während Sie in Ihrer pom.xml auf den PostgreSQL-JDBC-Treiber verweisen, haben Sie TopLink nicht als Abhängigkeit deklariert.

Meine Annahme (ich gebe zu) ist, dass die Persistenz-API TopLink (Ihren Persistence Provider) im Klassenpfad nicht findet. Fügen Sie TopLink als Abhängigkeit hinzu.

2

wenn Sie JPA + Eclipse Provider verwenden, als diesen Code verwenden

<properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/Database name" /> 
      <property name="javax.persistence.jdbc.user" value="" /> 
      <property name="javax.persistence.jdbc.password" value="" /> 
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> 
</properties> 
2

1) stellen Sie sicher, Sie haben die Persistenz-Provider definiert (für was auch immer Provider): Ex Für openjpa: <persistence-unit ...> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> ... ... </persistence-unit>

2) Wenn Sie benutzerdefinierte Build/Compile-Prozess verwenden (Maven, etc) stellen Sie sicher, dass Ihre Meta-INF/persistance.xml in den Ordner kompiliert/Klassen kopiert wird.

+0

Danke für den zweiten Punkt. Das war das Problem, das ich hatte. Vielen Dank!!! – nashuald

0

JPA ist eine Spezifikation hat mehrere Anbieter (Implementoren). Sie müssen eine auswählen, die den tatsächlichen Bytecode für die JPA-Spezifikation bereitstellt. Hibernate ist die übliche Wahl, aber Ihre kann anders sein. Sobald Sie das erkannt haben, fügen Sie das als eine Abhängigkeit in Ihr POM hinzu. Andernfalls fügen Sie die JAR-Datei zu Ihrem Erstellungspfad hinzu.

Verwandte Themen