2010-09-17 13 views
20

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.javax.persistence.PersistenceException: No proveedor de persistencia para EntityManager llamado customerManager

Ahora, intento ejecutar este JPA & Hibernate tutorial. He hecho todo lo que mencionan en este tutorial.

No tengo Oracle DB, solo MySQL. Así que hice algunos cambios para persistence.xml usando mi comprensión de la APP & Hibernate (no sé si es correcto o no ... me parece que es.)

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.

Actualización:

he hecho los cambios que se hacen a hacer. ¡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 !!!

Respuesta

19

Su persistence.xml no es válido y el EntityManagerFactory no se puede crear. Debe 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 cerradas, no deben ser anidados)

Actualización: que pasó por el tutorial y también tendrá que cambiar la generación Id estrategia al usar MySQL (ya que MySQL no admite secuencias). Sugiero usar la estrategia AUTO (por defecto es IDENTIDAD con MySQL). Para ello, retire la anotación SequenceGenerator y cambiar el código como el siguiente:

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

+0

Gracias por su responder. Pero sigue dando el mismo mensaje de error. Excepción en el hilo "main" javax.persistence.PersistenceException: No hay proveedor de Persistence para EntityManager llamado customerManager –

+0

Nuevamente, gracias por su actualización. Agregué ese log4j.jar en la carpeta lib como lo dijeron en el tutorial. ¿Cuál es la forma de inicializarlo? –

+0

@MaRaVan Necesita poner un 'log4j.propiedades' en el classpath. El tutorial proporciona un ejemplo. –

0

Un poco demasiado tarde, pero tengo el mismo problema y lo arreglaron conmutación schemaLocation en schemaLocation en el archivo persistence.xml (línea 1).

8

Estaba enfrentando el mismo problema. Me di cuenta de que estaba usando la clase de proveedor Incorrecta en persistencia.xml

Para Hibernate debe ser

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

Y para EclipseLink debe ser

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
25

simplemente para la corrección. hay otra situación que causa este error: falta el archivo META-INF/services/javax.persistence.spi.PersistenceProvider. para hibernar, 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.

ver this question.

+0

gracias, esto ayuda! –

+0

muy útil, este error me costó como una hora resolverlo. ¡Gracias! –

+0

gracias por esto! ¡Es extraño cómo tantos tutoriales omiten esta información vital! – NickJ

0

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 lleno 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, desapareció el mensaje de error.

así que creo que deberías intentar poner META-INF simple en el directorio src y colocando allí tu persistence.xml.

12

Tuve el mismo problema hoy. Mi persistence.xml estaba en la ubicación incorrecta. Tenía que ponerlo en la siguiente ruta:

project/src/main/resources/META-INF/persistence.xml 
+1

Eso hizo el truco. –

0

he visto este error, para mí el problema es que no había un espacio en la ruta absoluta del persistance.xml, la eliminación de la misma me ayudó.

0

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.

Cuestiones relacionadas