2010-11-23 70 views
5

Soy un novato de JPA y traté de hacer un ejemplo simple del libro. Pero no importa lo que yo puedo recibir siguiente error:"Error de No persistence provider for EntityManager"

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) 

Busqué en Google mucho y me hizo todo lo que he leído acerca de la APP.
Aquí es un árbol de directorios de mi proyecto:

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

Aquí es mi 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> 

Aquí está mi código fuente: 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(); 

    } 
} 

Y aquí está mi 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> 

¿Qué hago mal? Gracias de antemano.

Respuesta

7

JPA es una especificación implementada por múltiples proveedores de JPA (Hibernate, EclipseLink, OpenJPA, Toplink).

Debe elegir un proveedor para usar y agregar la dependencia adecuada a su pom.xml. También debe especificar su proveedor en persistence.xml.

Por ejemplo, si se utiliza OpenJPA (I lo elegimos para este ejemplo ya que su última versión está disponible en Maven central Repo, así que no hay necesidad de configurar repositorios específicos del fabricante):

<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

En realidad,

No parecen tener una dependencia de un proveedor de Peristence real.

JPA en sí mismo no tiene una implementación, también necesitará utilizar Hibernate/Toplink/OpenJPA como una solución real.

0

Según su persistence.xml, está utilizando TopLink con PostgreSQL como RDBMS. Mientras hace referencia al controlador JDBC de PostgreSQL en su pom.xml, no ha declarado TopLink como una dependencia.

Mi conjetura (lo admito) es que la API de persistencia no encuentra TopLink (su proveedor de persistencia) en el classpath. Prueba agregar TopLink como una dependencia.

2

si utiliza el proveedor EclipseLink APP + de utilizar este código

<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) asegúrese de que ha definido el proveedor de persistencia (por cualquier proveedor): ex por openjpa: <persistence-unit ...> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> ... ... </persistence-unit>

2) si está utilizando el proceso de compilación/compilación personalizado (maven, etc.) asegúrese de que su Meta-INF/persistance.xml se copie en la carpeta compiled/classes.

+0

Gracias por poner el 2do punto. Ese fue el problema que tuve. ¡¡¡Gracias!!! – nashuald

0

JPA es una especificación que tiene múltiples proveedores (implementadores). Debe elegir uno que proporcione el código de byte real para la especificación JPA. Hibernar es una opción común, pero la tuya puede ser diferente. Una vez que haya identificado eso, agréguelo como una dependencia en su POM. De lo contrario, agregue el archivo JAR a su ruta de compilación.

Cuestiones relacionadas