2010-09-17 8 views
20

Ich bin neu in JPA & Hibernate. Nachdem ich einige Online-Materialien gelesen habe, verstehe ich jetzt, was Hibernate ist und wie es mit JPA verwendet werden kann.javax.persistence.PersistenceException: Kein Persistence Provider für EntityManager namens customerManager

Jetzt versuche ich diese JPA & Hibernate tutorial ausführen. Ich habe alles getan, was sie in diesem Tutorial erwähnt haben.

Ich habe keine Oracle DB, nur MySQL. Also habe ich einige Änderungen an persistence.xml mit meinem Verständnis von JPA & Hibernate (ich weiß nicht, ob es richtig ist oder nicht ... Mir scheint, es ist.)

Hier ist meine 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> 

Aber ich scheine die Ergebnisse, die sie beschreiben, nicht zu bekommen. Es gibt mir:

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) 

Irgendwelche Vorschläge geschätzt wird.

Update:

ich die Änderungen vorgenommen haben, die getan gestellt werden. Aber immer noch die asme Fehlerzeilen !!!

Sie erwähnt nichts über orm.xml in diesem Tutorial. Kann es ein Problemverursacher sein !!!

Antwort

19

Ihre persistence.xml ist nicht gültig und die EntityManagerFactory kann nicht erstellt werden. Es sollte sein:

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

(Beachten Sie, wie die <property> Elemente geschlossen werden, sollten sie nicht verschachtelt werden)

Update: Ich ging durch das Tutorial, und Sie werden auch die Id Generation ändern müssen Strategie bei der Verwendung von MySQL (da MySQL keine Sequenzen unterstützt). Ich empfehle die Verwendung der AUTO Strategie (standardmäßig IDENTITY mit MySQL). Dazu entfernen Sie den SequenceGenerator Annotation und ändern Sie den Code wie folgt aus:

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

    ... 
} 

Dies sollte helfen.

PS: Sie sollten auch eine log4j.properties wie vorgeschlagen bereitstellen.

+0

Dank ändern sollte für Ihre Antworten. Aber es gibt immer noch die gleiche Fehlermeldung. Ausnahme im Thread "main" javax.persistence.PersistenceException: Kein Persistence Provider für EntityManager namens customerManager –

+0

Nochmals vielen Dank für Ihr Update. Ich habe diese log4j.jar im lib-Ordner hinzugefügt, wie sie im Tutorial gesagt haben. Wie kann man es initialisieren? –

+0

@MaRaVan Sie müssen ein 'log4j.Eigenschaften "auf dem Klassenpfad. Das Tutorial bietet ein Beispiel. –

0

Ein bisschen zu spät, aber ich habe das gleiche Problem und reparierte es schema in schema in der persistence.xml Datei (Linie 1) umgeschaltet wird.

8

Ich war mit dem gleichen Problem konfrontiert. Ich erkannte, dass ich die Persistenzklasse Wrong in Persistenz verwendete.xml

Für Hibernate sollte es

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

Und für Eclipse sollte es

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

nur der Vollständigkeit halber sein. Es gibt eine andere Situation, die diesen Fehler verursacht: fehlende Datei META-INF/services/javax.persistence.spi.PersistenceProvider. Für hibernate befindet es sich in hibernate-entitymanager-XXX.jar. Wenn also hibernate-entitymanager-XXX.jar nicht in Ihrem Klassenpfad enthalten ist, erhalten Sie diesen Fehler ebenfalls.

Diese Fehlermeldung ist so irreführend, und es kostet mich Stunden, um es richtig zu bekommen.

siehe this question.

+0

danke, das hilft! –

+0

sehr nützlich, dieser Fehler kostete mich wie eine Stunde, um es zu lösen. Vielen Dank! –

+0

danke dafür! Seltsam, wie viele Tutorials diese wichtigen Informationen auslassen! – NickJ

0

Meine Erfahrung sagt mir, dass fehlende persistence.xml, wird auch die gleiche Ausnahme erzeugen.

Ich fing den gleichen Fehler msg heute, als ich versuchte, ein JAR-Paket von Ant verpackt zu laufen.

Als ich jar tvf benutzte, um den Inhalt der JAR-Datei zu überprüfen, erkannte ich, dass "ant" vergessen hatte, die persistnece.xml für mich zu packen.

nachdem ich die JAR-Datei manuell neu packen, verschwand die Fehlermeldung msg.

also ich glaube, vielleicht sollten Sie versuchen, einfach META-INF unter src-Verzeichnis setzen und Ihre persistence.xml dort platzieren.

12

Ich hatte das gleiche Problem heute. Meine persistence.xml war am falschen Ort. Ich hatte es in den folgenden Pfad zu setzen:

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

Das hat den Trick gemacht. –

0

ich diesen Fehler gesehen haben, für mich die Frage gab es einen Raum, in dem absoluten Pfad der persistance.xml war, Entfernung derselben hat mir geholfen.

0

Ich hatte auch das gleiche Problem, als ich versuchte, JPA-Entity-Manager in Tomcat 8 konfiguriert zu bekommen. Zuerst habe ich ein Problem mit der SystemException-Klasse nicht gefunden und daher wurde die EntityManagerFactory nicht erstellt. Ich habe die Abhängigkeit des Hibernate-Entity-Managers entfernt, und dann konnte meine EntityManagerFactory den Persistenz-Provider nicht finden. Nach vielen Recherchen und der Zeit wurde klar, dass der Hibernate-Entity-Manager nach einer Konfiguration suchen muss. Dann setze den Entity Manager jar zurück und fügte dann JTA Api als Abhängigkeit hinzu und es funktionierte gut.

Verwandte Themen