java - unidad - No se ha identificado ningún proveedor de Persistence para EntityManager
persistence.xml jpa mysql example (22)
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
¡Simplemente copié el META-INF en src y trabajé!
Asegúrese de haber creado el archivo persistence.xml en la carpeta ''src''. Creé en la carpeta del proyecto y ese era mi problema.
Asegúrese de que el archivo persistence.xml
esté en el directorio: <webroot>/WEB-INF/classes/META-INF
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.
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.
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.
Debe agregar hibernate-entitymanager-x.jar en classpath.
En Hibernate 4.x, si el contenedor está presente, no es necesario agregar org.hibernate.ejb.HibernatePersistence en el archivo persistence.xml.
Después de <persistence-unit name="agisdb">
, defina el nombre del proveedor de persistencia:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
En un contexto OSGi, es necesario listar sus unidades de persistencia en el MANIFEST.MF del paquete, por ej.
JPA-PersistenceUnits: my-persistence-unit
De lo contrario, el paquete JPA no sabrá que su paquete contiene unidades de persistencia.
Ver http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE .
Enfrenté el 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.
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.
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ó.
Lo necesitaba en mi archivo pom.xml:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.6.Final</version>
</dependency>
Necesita los siguientes archivos jar en el classpath:
- antlr-2.7.6.jar
- commons-collections-3.1.jar
- dom4j-1.6.1.jar
- hibernate-commons-annotations-4.0.1.Final.jar
- hibernate-core-4.0.1.Final.jar
- hibernate-entitymanager.jar
- hibernate-jpa-2.0-api-1.0.0.Final.jar
- javassist-3.9.0.jar
- jboss-logging-3.1.1.GA.jar
- jta-1.1.jar
- slf4j-api-1.5.8.jar
- xxx-jdbc-driver.jar
Ocurre cuando el administrador de la entidad intenta señalar muchas unidades de persistencia. Haga los siguientes pasos:
- abra el archivo relacionado en su editor (siempre que su proyecto haya sido cerrado en su IDE)
- eliminar todo el código relacionado con la persistencia y el administrador de entidades
- guarda el archivo
- abre el proyecto en tu IDE
- ahora vincula el archivo db o la tabla de tu elección
Se enfrentó al mismo problema y no pudo encontrar una solución por un tiempo bastante largo. En mi caso, ayudó a reemplazar
<provider>org.hibernate.ejb.HibernatePersistence</provider>
con
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
Tomó la solución de here
Si está usando Maven, podría ser que no esté buscando el lugar correcto para la carpeta META-INF. Otros han mencionado copiar la carpeta, pero otra manera que funcionó para mí fue decirle a Maven dónde buscarla, usando la etiqueta <resources>
. Ver: http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
Si está utilizando Eclipse, asegúrese de que ese patrón de exclusión no elimine su persistence.xml
de las carpetas de origen en la ruta de compilación.
- Vaya a Propiedades -> Ruta de compilación de Java -> pestaña Origen
- Compruebe su patrón de exclusión que se encuentra en
MyProject/src/main/java -> Excluded: <your_pattern>
nodo de árbol - Opcionalmente,
Excluded: (None)
enExcluded: (None)
seleccionando el nodo y haciendo clic en el botón Editar ... de la izquierda.
Si hay diferentes nombres en Persistence.createEntityManagerFactory("JPAService")
en clases diferentes a las que obtiene el error. Al refactorizar, es posible obtener diferentes nombres que estaban en mi caso. En una clase, la Persistence.createEntityManagerFactory("JPAService")
en private void initComponents()
, la clase ContactsTable difería de Persistence.createEntityManagerFactory("JPAServiceExtended")
en la clase DBManager.
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!
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.
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
- antlr-2.7.7
- cdi-api-1.1
- classmate-1.3.0
- dom4j-1.6.1
- el-api-2.2
- geronimo-jta_1.1_spec-1.1.1
- hibernate-commons-annotation-5.0.1.Final
- hibernate-core-5.2.5.Final
- hibernate-jpa-2.1-api-1.0.0.Final
- jandex-2.0.3.Final
- javassist-3.20.0-GA
- javax.inject-1
- jboss-interceptor-api_1.1_spec-1.0.0.Beta1
- jboss -logging-3.3.0.Final
- 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>
- por favor, anote la información mencionada en la etiqueta <persistance> y la versión debe ser 2.1.
- 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