Sin proveedor de persistencia para EntityManager llamado


148

Tengo mi persistence.xmlcon el mismo nombre TopLinken el META-INFdirectorio. Entonces, tengo mi código llamándolo con:

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");

Sin embargo, recibí el siguiente mensaje de error:

2009-07-21 09: 22: 41,018 [main] ERROR - Sin proveedor de persistencia para EntityManager llamado agisdb
javax.persistence.PersistenceException: sin proveedor de persistencia para EntityManager llamado agisdb
    en javax.persistence.Persistence.createEntityManagerFactory (Persistence.java:89)
    en javax.persistence.Persistence.createEntityManagerFactory (Persistence.java:60)

Aquí está el persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="agisdb">
        <class>com.agis.livedb.domain.AddressEntity</class>
        <class>com.agis.livedb.domain.TrafficCameraEntity</class>
        <class>com.agis.livedb.domain.TrafficPhotoEntity</class>
        <class>com.agis.livedb.domain.TrafficReportEntity</class>
        <properties>
            <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/>
            <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="toplink.jdbc.user" value="root"/>
            <property name="toplink.jdbc.password" value="password"/>
        </properties>
    </persistence-unit>
</persistence>

Debería haber estado en el classpath. Sin embargo, obtuve el error anterior.

Respuestas:


85

Después <persistence-unit name="agisdb">, defina el nombre del proveedor de persistencia:

<provider>org.hibernate.ejb.HibernatePersistence</provider>

55
Estoy usando Derby y no fue necesario especificar esto (lo hice, pero luego lo eliminé una vez que resolví el problema, solo para asegurarme). Finalmente recibí el error porque persistence.xml no estaba en la carpeta src / META-INF, aunque había estado en una carpeta en la ruta de origen de Eclipse para el proyecto. Estoy pensando en algún lugar que está conectado para estar en src / *
Fuhrmanator

66
esto no era necesario en mi caso, pero classpathing hibernate-entitymanager * .jar como se indica en la respuesta de Ualter Jr a continuación. Estoy usando una aplicación GWT independiente con hibernate-core-4.3.7.jar , hibernate-entitymanager-4.3.7.Final.jar e hibernate-jpa-2.1-api-1.0.0.jar .
Andreas Dietrich

3
Lo mismo con @AndreasDietrich, después de reemplazar el artefacto "hibernate-core-4.3.10" con "hibernate-entitymanager-4.3.10" en pom.xml (uso maven), este error desapareció. En realidad, hibernate.org/orm/downloads dice que debe usar "hibernate-entitymanager-4.3.10" para JPA.
Hong

1
Aparte de esto, también tuve que pasar de hibernate-entitymanager-3.4.0.GA a 3.6.10.Final . En caso de que todavía tenga una base de código heredada con Hibernate 3.
Javi Vazquez

55
Estoy un poco sorprendido de que no tengas un problema con tu <provider/>, mientras que usando hibernate-4 debes cambiar tu proveedor <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>, consulta stackoverflow.com/questions/23041964/… .
Rob

86

Ponga "hibernate-entitymanager.jar"en el classpath de la aplicación.
Para las versiones más recientes, debe usar en "hibernate-core.jar"lugar de las obsoletashibernate-entitymanager

Si está ejecutando algún IDE, como Eclipse :Project Properties -> Java Build Path -> Libraries.

De lo contrario, póngalo en /libsu aplicación.


3
Me tomó unas horas darme cuenta de que esta era la causa. Para otras personas que buscan este tarro sangriento, en el caso de Hibernate 4.1.3, está en hibernate-release-4.1.3.Final \ lib \ jpa \ hibernate-entitymanager-4.1.3.Final.jar
Vedran

77
Y para aquellos de nosotros que estamos usando Maven, eso sería org.hibernateartifactid groupidhibernate-entitymanager
Simon Forsberg

2
Ha sido eclipselink.jar para mí, que faltaba en el camino. No hibernate * something.jar en el camino.
usuario desconocido

3
Solo pasé unas horas confirmando que persistence.xml estaba en camino de clase, y comparando cada faceta de un proyecto para el que funcionó y un proyecto para el que no funcionó. Mensaje de error muy engañoso ya que puede suceder si falta persistence.xml, si falta la PU con ese nombre, o aparentemente si falta un jar de hibernación.
David Mann

Para mí fue org.eclipse.persistence.jpacon prueba de alcance.
Marek

67

Asegúrese de que el persistence.xmlarchivo esté en el directorio:<webroot>/WEB-INF/classes/META-INF


8
esto no funcionó para mí, trajo la unidad de persistencia no encontrada: error 'nulo'. Volviendo a /src/main/resources/META-INF/persistence.xml
tomasb

1
Supongo que esto se aplica a aquellos que usan toplink (u otras cosas relacionadas con la web), para todos los demás, otras respuestas aquí pueden ser más apropiadas.
Simon Forsberg

2
Gracias, para mí el camino es target / classes / META-INF
Frizz1977

Lo mismo, por alguna extraña razón, debe estar en un directorio META-INF, de lo contrario no funcionará ...
Thomas

17

Necesitaba esto en mi archivo pom.xml:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.2.6.Final</version>
</dependency>

Funciona para la versión 4.3.11.
petertc

Está en desuso, ver arriba. Utilice hibernate-core en su lugar.
foo

16

Enfrenté el mismo problema y no pude encontrar la solución durante mucho tiempo En mi caso ayudó a reemplazar

<provider>org.hibernate.ejb.HibernatePersistence</provider>

con

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

Tomó una solución desde aquí


2
La actualización de Hibernate 4.3.5 a 5.2.12 y este cambio de nombre del proveedor me solucionaron el problema. Esa configuración parece permitir que JPA use el archivo .jar central en lugar del archivo .jar del administrador de entidades que se muestra como obsoleto en el repositorio central de Maven. Muchas gracias por compartir.
joshpt

10

Hay otro punto: si enfrenta este problema dentro de un entorno Eclipse RCP, es posible que tenga que cambiar la generación Factory de Persistence.createEntityManagerFactoryanew PersistenceProvider().createEntityManagerFactory

ver ECF para una discusión detallada sobre esto.


Este era el problema exacto que estaba teniendo con org.eclipse.persistence.jpa 2.4.0. Literalmente pasé 2 horas tirando de mi cabello preguntándome por qué no podría encontrar mi persisence.xml. Todos los ejemplos no parecen incorporar esto. oh bueno ... muchas muchas gracias!
Mark Miller

9

Tal vez definió un proveedor como <provider>org.hibernate.ejb.HibernatePersistence</provider>pero haciendo referencia a otro en jar. Eso sucedió conmigo: mi proveedor persistence.xml era openjpa pero estaba usando eclipselink en mi classpath. ¡Espero que esto ayude!


7

Consejo rapido:

  • compruebe si persistence.xml está en su 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), se debe especificar un proveedor de persistencia en alguna parte. Esto se puede hacer de dos maneras que yo sepa:

En mi caso, descubrí que debido a la mala configuración de Maven, el jar hibernate-entitymanager no se incluía como una dependencia, incluso si era una dependencia transitoria de otro módulo.


/ facepalm: olvidé agregar la dependencia de Maven para el proveedor de hibernación. ¡Gracias!
jgitter

5

Si está utilizando Eclipse, asegúrese de que el patrón de exclusión no elimine sus persistence.xmlcarpetas de origen en la ruta de compilación.

  1. Vaya a Propiedades -> Ruta de compilación de Java -> pestaña Fuente
  2. Verifique su patrón de exclusión que se encuentra en el
    MyProject/src/main/java -> Excluded: <your_pattern>
    nodo del árbol
  3. Opcionalmente, configúrelo Excluded: (None)seleccionando el nodo y haciendo clic en el botón Editar ... a la izquierda.

Resuelto mi problema El patrón excluido se estableció en "**" después de una recuperación / extracción. No sé por qué ...
Jocelyn

5

Llegué algunos años tarde a la fiesta aquí, pero llegué a la misma excepción al intentar que Hibernate 3.5.1 funcionara con HSQLDB y un programa JavaFX de escritorio. Lo hice funcionar con la ayuda de este hilo y mucha prueba y error. Parece que obtienes este error para una gran variedad de problemas:

No Persistence provider for EntityManager named mick

Traté de construir los ejemplos del tutorial de hibernación, pero debido a que estaba usando Java 10, no pude hacer que se construyeran y ejecutaran fácilmente. Renuncié a eso, no queriendo realmente perder el tiempo arreglando sus problemas. Configurar un archivo module-info.java (Jigsaw) es otra bola de pelo que muchas personas aún no han descubierto.

Algo confuso es que estos (a continuación) fueron los únicos dos archivos que necesitaba en mi archivo build.gradle. La documentación de Hibernate no es clara sobre exactamente qué jarras debe incluir. Entity-manager estaba causando confusión y ya no se requiere en la última versión de Hibernate, y tampoco lo es javax.persistence-api. Tenga en cuenta que estoy usando Java 10 aquí, así que tuve que incluir el jaxb-api, para evitar algunos errores de vinculación xml, así como agregar una entrada para el módulo de persistencia java en mi archivo module-info.java.

Build.gradle

// https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile('org.hibernate:hibernate-core:5.3.1.Final')

// https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'

Module-info.java

// Used for HsqlDB - add the hibernate-core jar to build.gradle too
requires java.persistence;

Con hibernate 5.3.1 no necesita especificar el proveedor, a continuación, en su archivo persistence.xml. Si no se proporciona uno, el proveedor de Hibernate se elige de forma predeterminada.

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

El archivo persistence.xml debe ubicarse en el directorio correcto, de modo que:

src/main/resources/META-INF/persistence.xml

Pasar por el código fuente de hibernación en el depurador Intellij, donde busca un dialecto, también arrojó exactamente la misma excepción, debido a una propiedad de dialecto faltante en el archivo persistence.xml. Agregué esto (agregue el correcto para su tipo de base de datos):

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

Todavía obtuve la misma excepción después de esto, por lo que al pasar nuevamente por el depurador en Intellij revelé que la entidad de prueba que intentaba persistir (ejemplo simple padre-hijo) tenía anotaciones faltantes para las relaciones OneToMany, ManyToOne. Arreglé esto y la excepción desapareció y mis entidades persistieron bien.

Aquí está mi persistencia final completa.xml:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
            http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="mick" transaction-type="RESOURCE_LOCAL">
    <description>
        Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
    </description>

    <!-- Provided in latest release of hibernate
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    -->

    <class>com.micks.scenebuilderdemo.database.Parent</class>
    <class>com.micks.scenebuilderdemo.database.Child</class>

    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>

        <property name="javax.persistence.jdbc.url"
                  value="jdbc:hsqldb:file:./database/database;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>

        <property name="javax.persistence.jdbc.user" value="sa"/>
        <property name="javax.persistence.jdbc.password" value=""/>

        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    </properties>

</persistence-unit>

</persistence>

Probablemente desperdicié aproximadamente medio día en esta joya. Mi consejo sería comenzar de manera muy simple: una sola entidad de prueba con uno o dos campos, ya que parece que esta excepción puede tener muchas causas.


Muchas gracias por los detalles de configuración. Realmente ayudó a resolverlo.
Doogle

4

Caso de esquina: si está utilizando m2Eclipse, automáticamente incluye exclusiones en sus carpetas de recursos. Luego, cuando intente ejecutar pruebas dentro de eclipse, la ausencia posterior de persistence.xml producirá este error.


3

Asegúrese de haber creado el archivo persistence.xml en la carpeta 'src'. Creé bajo la carpeta del proyecto y ese fue mi problema.


Eclipse 4.4.0 no quiere anidar carpetas SRC, por lo que estaba poniendo META-INF en el nivel superior, pensando que persistence.xml estar en el classpath sería adecuado. ¡NO! Tuve que crear manualmente un src / META-INF (en el sistema operativo) y mover el archivo persistence.xml a mano. Quizás sea posible hacer esto en Eclipse, pero no pude resolverlo.
Fuhrmanator


2

Ocurre cuando el administrador de la entidad intenta señalar muchas unidades de persistencia. Haz los siguientes pasos:

  1. abra el archivo relacionado en su editor (siempre que su proyecto se haya cerrado en su IDE)
  2. eliminar todo el código relacionado con la persistencia y el administrador de entidades
  3. guarda el archivo
  4. abre el proyecto en tu IDE
  5. ahora une la base de datos o la tabla de tu elección

2

Me enfrenté al mismo problema, pero en EclipseLink versión 2.5.0 .

Resolví mi problema agregando otro archivo jar que era necesariamente ( javax.persistence_2.1.0.v201304241213.jar.jar );

Tarros necesarios:
- javax.persistence_2.1.0.v201304241213.jar
- eclipselink.jar
- jdbc.jar (dependiendo de la base de datos utilizada).

Espero que esto ayude.


2

También tuve este error, pero el problema era el espacio de nombres uri en el persistence.xml.

Substituí http://xmlns.jcp.org/xml/ns/persistencea http://java.sun.com/xml/ns/persistencey la versión 2.1 a 2.0.

Ahora está funcionando


Eso es exactamente lo que me sucedió usando Tomcat. Acabo de agregar un encabezado completo para aclarar a los nuevos usuarios
childno͡.de

2

Debe agregar hibernate-entitymanager-x.jar en el classpath.

En Hibernate 4.x, si el jar está presente, no es necesario agregar org.hibernate.ejb.HibernatePersistence en el archivo persistence.xml.


1

La pregunta ya ha sido respondida, pero solo quería publicar un consejo que me estaba deteniendo. Esta excepción fue lanzada después de errores anteriores. Estaba recibiendo esto:

property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.

Aunque había cambiado persistence.xml para incluir el nuevo nombre de propiedad:

<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>

Siguiendo el mensaje sobre el nombre de propiedad en desuso, recibí la misma PersistenceException como la anterior y una serie de excepciones. Mi consejo: asegúrese de verificar el comienzo de la salchicha de excepción.

Parece que hay un error en Glassfish v2.1.1 en el que las implementaciones y las implementaciones no se actualizan persistence.xml, que se está almacenando en caché en alguna parte. Tuve que reiniciar el servidor y luego funcionó.



1

Necesita los siguientes archivos jar en el classpath:

  1. antlr-2.7.6.jar
  2. commons-collections-3.1.jar
  3. dom4j-1.6.1.jar
  4. hibernate-commons-annotations-4.0.1.Final.jar
  5. hibernate-core-4.0.1.Final.jar
  6. hibernate-entitymanager.jar
  7. hibernate-jpa-2.0-api-1.0.0.Final.jar
  8. javassist-3.9.0.jar
  9. jboss-logging-3.1.1.GA.jar
  10. jta-1.1.jar
  11. slf4j-api-1.5.8.jar
  12. xxx-jdbc-driver.jar


1

Hibernate 5.2.5
Archivos Jar necesarios en la ruta de clase. Esto está dentro de una carpeta requerida de Hibernate 5.2.5 Versión final. Se puede descargar desde http://hibernate.org/orm/downloads/

  1. antlr-2.7.7
  2. cdi-api-1.1
  3. compañero de clase-1.3.0
  4. dom4j-1.6.1
  5. el-api-2.2
  6. geronimo-jta_1.1_spec-1.1.1
  7. hibernate-commons-annotation-5.0.1.Final
  8. hibernate-core-5.2.5.Final
  9. hibernate-jpa-2.1-api-1.0.0.Final
  10. jandex-2.0.3.Final
  11. javassist-3.20.0-GA
  12. javax.inject-1
  13. jboss-interceptor-api_1.1_spec-1.0.0.Beta1
  14. jboss-logging-3.3.0.Final
  15. jsr250-api-1.0

Cree un archivo xml "persistence.xml" en

YourProject / src / META-INF / persistence.xml

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
         http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="sample">

    <class>org.pramod.data.object.UserDetail</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate_project"/>
        <property name="hibernate.connection.username" value="root"/>
        <property name="hibernate.connection.password" value="root"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="false"/>

        <property name="hibernate.cache.use_second_level_cache" value="false"/>

        <property name="hibernate.archive.autodetection" value="true"/>
    </properties>
</persistence-unit>

  1. tenga en cuenta que la información mencionada en la etiqueta <persistance> y la versión deben ser 2.1.
  2. tenga en cuenta la etiqueta de nombre <unidad de persistencia>, el nombre se menciona como "muestra" . Este nombre debe usarse exactamente igual al cargar su

EntityManagerFactor = Persistance.createEntityManagerFactory ("muestra"); . "muestra" se puede cambiar según su convención de nomenclatura

Ahora crea una clase de entidad. con nombre según mi ejemplo UserDetail, en el paquete org.pramod.data.object

UserDetail.java

package org.pramod.data.object;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user_detail")
public class UserDetail {
    @Id
    @Column(name="user_id")
    private int id;
    @Column(name="user_name")
    private String userName;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }   
    @Override
    public String toString() {
       return "UserDetail [id=" + id + ", userName=" + userName + "]";
    }
}

Ahora crea una clase con el método principal.

HibernateTest.java

package org.pramod.hibernate;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.pramod.data.object.UserDetail;

public class HibernateTest {
    private static EntityManagerFactory entityManagerFactory;

    public static void main(String[] args)  {
        UserDetail user = new UserDetail();
        user.setId(1);
        user.setUserName("Pramod Sharma");

        try {
            entityManagerFactory = Persistence.createEntityManagerFactory("sample");
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            entityManager.getTransaction().begin();
            entityManager.persist( user );
            entityManager.getTransaction().commit();
            System.out.println("successfull");
            entityManager.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

La salida será

UserDetail [id=1, userName=Pramod Sharma]
Hibernate: drop table if exists user_details
Hibernate: create table user_details (user_id integer not null, user_name varchar(255), primary key (user_id))
Hibernate: insert into user_details (user_name, user_id) values (?, ?)
successfull

1

En mi caso, anteriormente utilizo idea para generar entidad por esquema de base de datos, y persistence.xmlse genera automáticamente en src/main/java/META-INF, y de acuerdo con https://stackoverflow.com/a/23890419/10701129 , lo muevo asrc/main/resources/META-INF , también marcado META-INF como raíz fuente Esto funciona para mi.

Pero simplemente marcar el META-INF original (es decir, src / main / java / META-INF) como raíz fuente, no funciona, lo que me confunde.

y esta es la estructura: ingrese la descripción de la imagen aquí


0

Si hay diferentes nombres en Persistence.createEntityManagerFactory("JPAService")diferentes clases, obtendrá el error. Al refactorizar es posible obtener diferentes nombres, como en mi caso. En una clase de la auto-generado Persistence.createEntityManagerFactory("JPAService")en private void initComponents()la clase ContactsTable difería de Persistence.createEntityManagerFactory("JPAServiceExtended")la clase DBManager.


0

La mía se resolvió agregando información en persistence.xml, por ejemplo, <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>y luego asegurándome de tener la biblioteca en classpath, por ejemplo, en Maven, agregue dependencia como

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.5.0</version>
</dependency>

0

Verifique el nombre de la unidad permanente

<persistence-unit name="com.myapp.model.jpa"
    transaction-type="RESOURCE_LOCAL">    
public static final String PERSISTENCE_UNIT_NAME = "com.myapp.model.jpa";
Persistence.createEntityManagerFactory(**PERSISTENCE_UNIT_NAME**);

0

En mi caso, se trataba de un error en dos propiedades como a continuación. Cuando los cambié, el proveedor 'Sin persistencia para EntityManager llamado' desapareció.

Por lo tanto, puede intentar probar la conexión con sus propiedades para verificar si todo está correcto.

<property name="javax.persistence.jdbc.url" value="...”/>
<property name="javax.persistence.jdbc.password" value="...”/>

Extraño error, estaba totalmente confundido por eso.


0

Intente también copiar el persistence.xml manualmente en la carpeta <project root>\bin\META-INF. Esto solucionó el problema en Eclipse Neon con el EclipseLink 2.5.2uso de un proyecto de complemento simple.


0

Tuve el mismo problema, pero esto realmente funcionó para mí:

mvn install -e  -Dmaven.repo.local=$WORKSPACE/.repository.

NB: El comando maven anterior reinstalará todas las dependencias de su proyecto desde cero. Su consola se cargará con registros detallados debido a la solicitud de red que está haciendo Maven.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.