wake-up-neo.com

javax.persistence.PersistenceException: Kein Persistenzanbieter für EntityManager namens customerManager

Ich bin neu bei JPA & Hibernate. Nach dem Lesen einiger Online-Materialien habe ich jetzt verstanden, was Hibernate ist und wie es mit JPA verwendet werden kann.

Jetzt versuche ich, dieses JPA & Hibernate-Tutorial auszuführen. Ich habe alles getan, was sie in diesem Tutorial erwähnen.

Ich habe keine Oracle DB, nur MySQL. Also habe ich persistence.xml mit meinem Verständnis von JPA und Hibernate geändert (ich weiß nicht, ob es richtig ist oder nicht ... Scheint mir so.)

Hier ist mein 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 nicht die Ausgabe zu bekommen, die sie beschreiben. 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 werden geschätzt.

Update:

Ich habe die gewünschten Änderungen vorgenommen. Aber immer noch die asme Fehlerzeilen bekommen !!!

Sie haben in diesem Tutorial nichts über orm.xml erwähnt. möge es ein problemverursacher sein !!!

20
user405398

Ihr persistence.xml ist ungü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 sind. Sie sollten nicht geschachtelt werden.)

Update: Ich habe das Tutorial durchlaufen und Sie müssen auch die Generierungsstrategie für Id ändern, wenn Sie MySQL verwenden (da MySQL keine Sequenzen unterstützt). Ich empfehle die AUTO-Strategie (Standardeinstellung für IDENTITY mit MySQL). Entfernen Sie dazu die Annotation SequenceGenerator und ändern Sie den Code folgendermaßen:

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

   ...
}

Das sollte helfen.

PS: Sie sollten auch einen log4j.properties wie vorgeschlagen angeben.

20
Pascal Thivent

Nur zur Vollständigkeit. Es gibt eine andere Situation, die diesen Fehler verursacht: 

fehlt META-INF/services/javax.persistence.spi.PersistenceProvider Datei.

Für Hibernate befindet es sich in hibernate-entitymanager-XXX.jar. Wenn hibernate-entitymanager-XXX.jar nicht in Ihrem Klassenpfad enthalten ist, wird dieser Fehler ebenfalls angezeigt.

Diese Fehlermeldung ist so irreführend und es kostet mich Stunden, sie zu korrigieren.

Siehe JPA 2.0 mit Hibernate als Anbieter - Ausnahme: Kein Persistenzanbieter für EntityManager .

25
turtledove

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

project/src/main/resources/META-INF/persistence.xml
15
Dan Torrey

Ich stand vor demselben Problem. Mir wurde klar, dass ich die falsche Providerklasse in persistence.xml verwendet habe

Für den Winterschlaf sollte es sein 

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

Und für EclipseLink sollte es sein

<provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider>
10
Vivek

Wenn Sie Hibernate 5.2.10.Final verwenden, sollten Sie dies ändern

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

zu 

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

in Ihrer Persistenz.xml

Gemäß Hibernate 5.2.2: Kein Persistenzanbieter für EntityManager

2
Justas

Wenn Sie Maven verwenden, haben Sie möglicherweise beide src/{main,test}/resources/META-INF/persistence.xml. Dies ist ein allgemeines Setup: Testen Sie Ihren JPA-Code mit h2 oder Derby und stellen Sie ihn mit PostgreSQL oder einem anderen vollständigen DBMS bereit. Wenn Sie dieses Muster verwenden, stellen Sie sicher, dass die beiden Dateien unterschiedliche unit-Namen haben. Andernfalls versuchen einige Versionen der Persistence-Klasse, BOTH zu laden (da Ihre Testzeit CLASSPATH natürlich sowohl Klassen als auch Test- Klassen); Dies führt zu widersprüchlichen Definitionen der Persistenzeinheit, was zu der gefürchteten ärgerlichen Nachricht führt, die wir alle so sehr hassen!

Schlimmer noch: Dies kann mit einigen älteren Versionen von "Hibernate" "funktionieren", aber mit den aktuellen Versionen schlägt dies fehl. Lohnt es sich trotzdem, es richtig zu machen ...

1
idarwin

Ein bisschen zu spät, aber ich hatte das gleiche Problem und es wurde behoben, dass schemalocation in schemaLocation in der Datei persistence.xml (Zeile 1) geändert wurde.

0
Nicolas Landier

Ich war auch mit demselben Problem konfrontiert, als ich versuchte, den JPA-Entity Manager in Tomcat 8 zu konfigurieren. Zuerst habe ich ein Problem, bei dem die SystemException-Klasse nicht gefunden wurde und daher die EntityManagerFactory nicht erstellt wurde. Ich habe die Abhängigkeit von Hibernate Entity Manager entfernt und meine EntityManagerFactory konnte dann nicht nach dem Persistenzanbieter suchen. Nach vielen Recherchen und der Zeit erfuhr sie, dass der Hibernate Entity Manager nach einigen Konfigurationen suchen muss. Setzen Sie dann das Entitätsmanager-Glas zurück und fügen Sie JTA Api als Abhängigkeit hinzu, und es hat gut funktioniert.

Ich habe diesen Fehler gesehen, für mich bestand das Problem darin, dass im absoluten Pfad der persistance.xml ein Leerzeichen enthalten war.

0
Raja