persistencecontext - javax.persistence.PersistenceException: ningún proveedor de persistencia para EntityManager llamado customerManager
jpa controller (10)
Soy nuevo en JPA & Hibernate. Después de leer algunos materiales en línea, ahora entiendo qué es Hibernate y cómo se puede usar con JPA.
Ahora, estoy intentando ejecutar este tutorial de JPA & Hibernate . He hecho todo lo que mencionan en este tutorial.
No tengo Oracle DB, solo MySQL. Así que realicé algunos cambios en persistence.xml
usando mi comprensión de JPA e Hibernate (no sé si es correcto o no ... Parece que sí).
Aquí está mi persistence.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="customerManager" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>Customer</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="1234"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/>
<property name="hibernate.max_fetch_depth" value="3"/>
</properties>
</persistence-unit>
</persistence>
Pero no parece obtener el resultado que describen. Me está dando:
Customer id before creation:null
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named customerManager
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
at CustomerDAO.create(CustomerDAO.java:8)
at CustomerDAO.main(CustomerDAO.java:22)
Cualquier sugerencia será apreciada.
Actualizar:
Hice los cambios que se solicitan. ¡Pero aún obteniendo las líneas de error de asme!
No mencionaron nada sobre orm.xml en ese tutorial. ¡¡Puede ser un causante de problemas !!!
Estaba enfrentando el mismo problema. Me di cuenta de que estaba usando la clase de proveedor Wrong en persistence.xml
Para Hibernate debería ser
<provider>org.hibernate.ejb.HibernatePersistence</provider>
Y para EclipseLink debería ser
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
He visto este error, para mí el problema era que había un espacio en la ruta absoluta de persistance.xml, la eliminación de la misma me ayudó.
Si está utilizando Maven, puede tener tanto src/{main,test}/resources/META-INF/persistence.xml
. Esta es una configuración común: pruebe su código JPA con h2 o Derby y despliéguelo con PostgreSQL u otro DBMS completo. Si está utilizando este patrón, asegúrese de que los dos archivos tengan nombres de unidades diferentes , de lo contrario, algunas versiones de la clase Persistence
intentarán cargar BOTH (porque, por supuesto, su CLASSPATH de prueba incluye ambas clases y clases de prueba); ¡Esto causará definiciones contradictorias de la unidad de persistencia, dando como resultado el temido mensaje molesto que todos odiamos tanto!
Peor aún: esto puede "funcionar" con algunas versiones anteriores de, por ejemplo, Hibernate, pero falla con las versiones actuales. Vale la pena hacerlo bien de todos modos ...
Si usa Hibernate 5.2.10.Final, debe cambiar
<provider>org.hibernate.ejb.HibernatePersistence</provider>
a
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
en su persistence.xml
De acuerdo con Hibernate 5.2.2: No hay proveedor de persistencia para EntityManager
Solo por completitud. Hay otra situación que causa este error:
falta el archivo META-INF / services / javax.persistence.spi.PersistenceProvider.
Para Hibernate, está ubicado en hibernate-entitymanager-XXX.jar
, por lo que si hibernate-entitymanager-XXX.jar
no está en su classpath, también obtendrá este error.
Este mensaje de error es tan engañoso y me cuesta horas corregirlo.
Su persistence.xml
no es válido y EntityManagerFactory
no se puede crear. Debería ser:
<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="customerManager" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>Customer</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="1234"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/>
<property name="hibernate.max_fetch_depth" value="3"/>
</properties>
</persistence-unit>
</persistence>
(Observe cómo los elementos <property>
están cerrados, no deben estar anidados)
Actualización: revisé el tutorial y también tendrá que cambiar la estrategia de generación de Id
cuando use MySQL (ya que MySQL no admite secuencias). Sugiero usar la estrategia AUTO
(por defecto es IDENTIDAD con MySQL). Para hacerlo, elimine la anotación SequenceGenerator
y cambie el código como este:
@Entity
@Table(name="TAB_CUSTOMER")
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="CUSTOMER_ID", precision=0)
private Long customerId = null;
...
}
Esto debería ayudar.
PD: también debe proporcionar un log4j.properties
según lo sugerido.
También estaba enfrentando el mismo problema cuando intentaba configurar el administrador de entidades JPA en Tomcat 8. Primero tengo un problema con la clase SystemException que no se encuentra y, por lo tanto, no se creó entityManagerFactory. Eliminé la dependencia del administrador de entidades de hibernación y luego mi entityManagerFactory no pudo buscar el proveedor de persistencia. Después de pasar por una gran cantidad de investigación y el tiempo se enteró de que el administrador de la entidad hibernate debe buscar alguna configuración. Luego volvió a colocar el jar administrador de entidades y luego agregó JTA Api como una dependencia y funcionó bien.
Tuve el mismo problema hoy. Mi persistence.xml estaba en la ubicación incorrecta. Tuve que ponerlo en la siguiente ruta:
project/src/main/resources/META-INF/persistence.xml
Un poco tarde pero recibí el mismo problema y lo solucioné cambiando la ubicación del esquema en schemaLocation en el archivo persistence.xml (línea 1).
mi experiencia me dice que la falta de persistence.xml generará la misma excepción también.
Cogí el mismo mensaje de error hoy cuando traté de ejecutar un paquete jar empaquetado por hormiga.
cuando utilicé jar tvf para verificar el contenido del archivo jar, me di cuenta de que "hormiga" olvidó empacar el persistnece.xml para mí.
después de volver a empaquetar manualmente el archivo jar, el mensaje de error desapareció.
así que creo que tal vez deberías intentar poner META-INF en el directorio src y colocar tu persistence.xml allí.