2010-09-17 13 views
20

I am new to JPA & Hibernate. Dopo aver letto alcuni materiali online ora capisco cosa sia Hibernate e come possa essere usato con JPA.javax.persistence.PersistenceException: nessun provider di persistenza per EntityManager denominato customerManager

Ora, sto cercando di eseguire questo JPA & Hibernate tutorial. Ho fatto tutto ciò che hanno menzionato in questo tutorial.

Non ho Oracle DB, solo MySQL. Così ho fatto alcune modifiche al persistence.xml usando la mia comprensione di JPA & Hibernate (non so se sia corretto o meno ... a me sembra che sia.)

Ecco il mio 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> 

Ma non sembra che ottenga l'output che descrivono. E mi sta 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) 

Tutti i suggerimenti saranno apprezzati.

Aggiornamento:

Ho fatto i cambiamenti che si chiede di fare. Ma, ottenendo ancora le righe di errore ASME !!!

Non hanno menzionato nulla su orm.xml in questo tutorial. potrebbe essere un problema causatore !!!

risposta

19

Il persistence.xml non è valido e non è possibile creare EntityManagerFactory. Dovrebbe essere:

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

(Si noti come gli elementi <property> sono chiuse, non dovrebbero essere annidati)

Aggiornamento: Sono andato attraverso il tutorial e si avrà anche per cambiare il Id generazione strategia quando si usa MySQL (dato che MySQL non supporta le sequenze). Suggerisco di utilizzare la strategia AUTO (predefinita per IDENTITY con MySQL). Per fare ciò, togliere il SequenceGenerator annotazione e modificare il codice in questo modo:

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

    ... 
} 

Questo dovrebbe aiutare.

PS: è necessario fornire anche un log4j.properties come suggerito.

+0

Grazie per la vostra risposta. Ma continua a dare lo stesso messaggio di errore. Eccezione nel thread "main" javax.persistence.PersistenceException: nessun provider di Persistenza per EntityManager denominato customerManager –

+0

Ancora grazie per il tuo aggiornamento. Ho aggiunto log4j.jar nella cartella lib come hanno detto nel tutorial. Qual è il modo per inizializzarlo? –

+0

@MaRaVan È necessario inserire un 'log4j.proprietà' sul classpath. Il tutorial fornisce un esempio. –

0

Un po 'troppo tardi, ma ho avuto lo stesso problema e riparato il passaggio schemaLocation in schemaLocation nel file di persistence.xml (linea 1).

8

Mi trovavo di fronte allo stesso problema. Mi sono reso conto che stavo usando la classe del provider Wrong in persistenza.xml

Per Hibernate dovrebbe essere

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

E per EclipseLink dovrebbe essere

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

solo per completezza. c'è un'altra situazione che causa questo errore: manca il file META-INF/services/javax.persistence.spi.PersistenceProvider. per ibernazione, si trova in hibernate-entitymanager-XXX.jar, quindi, se hibernate-entitymanager-XXX.jar non si trova nel classpath, si avrà anche questo errore.

questo messaggio di errore è così fuorviante e mi costa ore per farlo correttamente.

vedere this question.

+0

grazie, questo aiuta! –

+0

molto utile, questo errore mi è costato come un'ora per risolverlo. Grazie! –

+0

grazie per questo! Strano come tanti tutorial omettano queste informazioni vitali! – NickJ

0

la mia esperienza mi dice che manca persistence.xml, genererà la stessa eccezione.

Ho rilevato lo stesso errore di oggi quando ho tentato di eseguire un pacchetto jar imballato da ant.

quando ho usato jar tvf per controllare il contenuto del file jar, mi sono reso conto che "ant" ha dimenticato di comprimere il persistnece.xml per me.

dopo aver reimpacchettato manualmente il file jar, il messaggio di errore è scomparso.

quindi credo che dovresti provare a mettere semplicemente META-INF sotto la directory src e mettere lì il tuo persistence.xml.

12

Ho avuto lo stesso problema oggi. Il mio persistence.xml si trovava nella posizione sbagliata. Ho dovuto metterlo nel seguente percorso:

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

Questo ha fatto il trucco. –

0

Ho visto questo errore, per me il problema è che c'era uno spazio nel percorso assoluto del persistance.xml, la rimozione dello stesso mi ha aiutato.

0

Anche io stavo affrontando lo stesso problema quando stavo cercando di ottenere il gestore dell'entità JPA configurato in Tomcat 8. Innanzitutto ho un problema con la classe SystemException non trovata e quindi non è stato creato entityManagerFactory. Ho rimosso la dipendenza dell'entità gestore di ibernazione e quindi la mia entityManagerFactory non è stata in grado di cercare il provider di persistenza. Dopo aver attraversato un sacco di ricerche e di tempo, è venuto a sapere che il gestore di entità in ibernazione deve cercare una qualche configurazione. Quindi rimetti il ​​jar del gestore entità e quindi aggiunto JTA Api come dipendenza e ha funzionato correttamente.

Problemi correlati