'java.lang.NoSuchFieldError' während der Verwendung der JPA
Ich erhalte die folgende Fehlermeldung beim Versuch aus dieser JPA tutorial:
java.lang.NoSuchFieldError: NONE
at org.hibernate.ejb.QueryImpl.<init>(QueryImpl.java:609)
at org.hibernate.ejb.QueryImpl.<init>(QueryImpl.java:80)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:272)
at entity.PersonTest.insertAndRetrieve(PersonTest.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Hier ist mein persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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_2_0.xsd"
version="2.0">
<persistence-unit name="examplePersistenceUnit" transaction-type="RESOURCE_LOCAL">
<class>entity.Person</class>
<properties>
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa_test" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="admin" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
Person.java
package entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
public class Person {
@Id
@GeneratedValue
private int id;
private String firstName;
private char middleInitial;
private String lastName;
private String streetAddress1;
private String streetAddress2;
private String city;
private String state;
private String zip;
.
.
.
(getters and setters)
Teil meiner JUnit-Test-Datei:
@SuppressWarnings("unchecked")
@Test
public void insertAndRetrieve() {
em.getTransaction().begin();
em.persist(p1);
em.persist(p2);
em.getTransaction().commit();
final List<Person> list = em.createQuery("select p from Person p")
.getResultList();
System.out.println("here...");
assertEquals(2, list.size());
Ich bin mit MySQL-db, die "person" - Tabelle wird in der Datenbank vorhanden. Und nach
em.getTransaction().begin();
em.persist(p1);
em.persist(p2);
em.getTransaction().commit();
Ich kann sehen, dass die zwei Datensätze eingefügt werden, die in der person-Tabelle. Aber auf die nächste Anweisung, es schlägt fehl.
EDIT 1:
Gläser in meinem build-path:
antlr-2.7.6.jar,
commons-collections-3.1.jar,
dom4j-1.6.1.jar, hibernate3.jar,
hibernate-annotations-3.5.5-Final.jar,
hibernate-commons-annotations-3.2.0.Final.jar,
hibernate-entitymanager-3.5.5-Final.jar,
hibernate-entitymanager-3.5.5-Final-sources.jar,
javaee-api-5.0-3.jar,
javassist-3.9.0.GA.jar,
log4j-1.2.12.jar,
mysql-connector-java-5.1.15.jar,
slf4j-api-1.6.1.jar,
slf4j-simple-1.6.1.jar,
hibernate-jpa-2.0-api-1.0.0-CR-1.jar
Kann mir jemand sagen was ich falsch mache?
Dank.
- Mit
@Entity
Sie brauchen nicht zu erklären, Personen in persistence.xml. Das tutorial du verwendest sieht schrecklich. Darf ich vorschlagen, die offizielle (und erstklassige) Java EE 6 Tutorial statt? - Ball: ich habe versucht, wieder nach entfernen. Immer noch der gleiche Fehler.
- Welche Bibliotheken/Gläser sind vorhanden in den Laufzeit-classpath?
- Ich nehme an, du hast PPV 1 und PPV 2-Implementierungen auf Ihre Klassenpfad. Dadurch würde dieser Fehler.
- können Sie genauer zu sein, wie sollte ich eine Fahrt von JPA 1.0? Als Vineet vorgeschlagen, habe ich entfernt ejb3-persistence.jar aus build-Pfad und ich habe auch neueste version von
hibernate-commons-annotations.jar
(65kb). Was ich sonst noch tun müssen? (Habe ich erwähnt, enthalten die Gläser am Ende der Frage.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entfernen ejb3-persistence.jar JAR-Datei von der Klasse Weg. Es enthält die Schnittstellen der JPA-1.0-Spezifikation. Müssen Sie behalten die hibernate-jpa-2.0-api-1.0.0-CR-1.jar JAR-Datei enthält die Schnittstellen für die JPA-2.0-Spezifikation.
Hinweis: Wenn Sie arbeiten müssen, um gegen die JPA 1.0, dann verwenden Sie nicht den Ruhezustand 3.5.5 enthält die JPA 2.0 Implementierung. In der Zukunft, die Verwendung von Maven für dependency management); es wird Ihnen helfen, vermeiden Sie diese Probleme.
Nachtrag:
Wenn ich das setup Hibernate EntityManager 3.5.5 (JPA 2) vor Kratzer, diese würde ich die Dateien betrachten würden. Die folgende Liste wurde abgeleitet aus die Hibernate-Dokumentation :
Den letzten beiden noch nicht in der Dokumentation erwähnt, aber erforderlich sind. Ich sehe nicht die Notwendigkeit, für die anderen Gläser, mit Ausnahme mysql-connector-java-5.1.15.jar und log4j-1.2.12.jar (beides konnte beibehalten werden).
Sieht aus wie Sie haben eine ähnliche Frage zu diesem:
"java.lang.NoSuchFieldError: NONE" in hibernate mit Spring 3, maven, JPA, c3p0