[java] No se ha identificado ningún proveedor de Persistence para EntityManager



Answers

Coloque el "hibernate-entitymanager.jar" en el classpath de la aplicación.
Para versiones más nuevas, debe usar "hibernate-core.jar" lugar de "hibernate-core.jar" en desuso

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

De lo contrario, colóquelo en la /lib de su aplicación.

Question

Tengo mi persistence.xml con el mismo nombre, usando toplink, bajo el directorio META-INF. 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 - No Persistence provider for EntityManager named agisdb
javax.persistence.PersistenceException: No Persistence provider for EntityManager named agisdb
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
    at 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 la ruta de clases ... Sin embargo, obtuve el error anterior ... Realmente agradezco cualquier ayuda ... Gracias




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



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

  1. abra el archivo relacionado en su editor (siempre que su proyecto haya sido 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 vincula el archivo db o la tabla de tu elección



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

ver ECF para una discusión detallada sobre esto.




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:

  • añadir elemento de proveedor a la unidad de persistencia: <provider>org.hibernate.ejb.HibernatePersistence</provider> (como se describe en la respuesta correcta de Chris: https://.com/a/1285436/784594 )
  • o el proveedor para la interfaz javax.persistence.spi.PersistenceProvider se debe especificar como un servicio, consulte aquí: http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html (esto es generalmente incluido cuando incluye hibernación u otra implementación de JPA en su classpath

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




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




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

http://xmlns.jcp.org/xml/ns/persistence por http://java.sun.com/xml/ns/persistence y la versión 2.1 por 2.0.

Ahora está funcionando.




Lo necesitaba en mi archivo pom.xml:

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






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

  1. antlr-2.7.7
  2. cdi-api-1.1
  3. classmate-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. por favor, anote la información mencionada en la etiqueta <persistance> y la versión debe ser 2.1.
  2. tenga en cuenta la etiqueta name <persistance-unit>, el nombre se menciona como "muestra" . Este nombre debe usarse exactamente igual mientras carga 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



La pregunta ya fue respondida, pero solo quería publicar un consejo que me estaba deteniendo. Esta excepción se lanzó después de errores previos. Estaba obteniendo esto:

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

Aunque cambié el archivo 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 la propiedad en desuso, obtenía la misma PersistenceException como la anterior y una cadena de excepciones completamente distinta. Mi consejo: asegúrese de verificar el comienzo de la salchicha de excepción.

Parece que hay un error en Glassfish v2.1.1 donde redespliegues, anulaciones e implementaciones no actualizan persistence.xml, que se almacena en caché en algún lugar. Tuve que reiniciar el servidor y luego funcionó.






Related