No hay proveedor de Persistence para EntityManager llamado X

Estoy desarrollando una aplicación JavaSE usando JPA. Desafortunadamente, obtengo un null después de llamar: Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

Abajo encontrarás:

  • Un fragmento de mi código que invoca EntityManagerFactory e inesperadamente devuelve null
  • Mi archivo persistence.xml
  • Mi estructura de proyecto

Fragmento de mi código:

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

Mi persistence.xml:

    org.apache.openjpa.persistence.PersistenceProviderImpl path.to.package.server.Todo false         

Mi estructura de proyecto:

Esta es la estructura de mi proyecto:

Debe mover persistence.xml archivo persistence.xml a una ubicación adecuada.

Más específicamente, agregue el archivo META-INF/persistence.xml a la raíz de una carpeta fuente.

En este caso, la siguiente es una ubicación adecuada: src\main\java\META-INF\persistence.xml

Aquí están los detalles: (tomado de la especificación de JPA )

 A persistence.xml file defines a persistence unit. The persistence.xml file is located in the META-INF directory of the root of the persistence unit. 

La raíz de la unidad de persistencia es la clave aquí.

Si eres una aplicación que no es Java EE

 The jar file or directory whose META-INF directory contains the persistence.xml file is termed the root of the persistence unit. 

Si está en una aplicación Java EE , los siguientes son válidos

 In Java EE environments, the root of a persistence unit must be one of the following: • an EJB-JAR file • the WEB-INF/classes directory of a WAR file[80] • a jar file in the WEB-INF/lib directory of a WAR file • a jar file in the EAR library directory • an application client jar file 

Consejo rápido:

  • comprueba si persistence.xml está en tu classpath
  • compruebe si el proveedor de hibernación está en su classpath

Con el uso de JPA en una aplicación independiente (fuera de JavaEE), un proveedor de persistencia necesita ser especificado en alguna parte. Esto se puede hacer de dos maneras que conozco:

En mi caso, descubrí que debido a una mala configuración del administrador , hibernate-entitymanager.jar no se incluyó como dependencia, incluso si se trataba de una dependencia transitoria de otro módulo.

Consulte también las respuestas aquí: No se ha identificado ningún proveedor de Persistence para EntityManager

Recientemente actualicé NB 8.1 a 8.2 y de repente me enfrenté a este problema y pasé 2 días rompiéndome la cabeza para resolverlo. Hasta 8.1, eliminar el procesador (mencionado anteriormente por otros) funcionó. Con 8.2, el problema persistió.

Finalmente, descubrí que eclipselink.jar falta en la biblioteca predeterminada de EclipseLink (JPA 2.1). Agregué el archivo a la definición de la biblioteca y listo, ¡comenzó a funcionar!

Entonces, en mi caso, todo estaba en la ruta de clase, pero tuve que agregar

Clase c = Class.forName (“org.eclipse.persistence.jpa.PersistenceProvider”);

Creo que esto hizo que el PersistenceProvider se registrara en las clases javax. He tenido que hacer algo similar para los controladores JDBC en el pasado también.

Si no quiere mover su carpeta META-INF (tal vez porque es allí donde lo creó su IDE y no quiere confundirla), y si está usando Maven, puede decirle a Maven dónde buscar META- INF utilizando la etiqueta . Ver: http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

En tu caso:

    src    

No le dé explícitamente la dependencia de JPA

   javax.persistence persistence-api 1.0.2  

Gracias,
Rahul

    Intereting Posts