Hallo.
Ich habe ein Eclipselink(v2.6))-Beispiel mit Derby(v10.13.1.1) von der Seite http://www.vogella.com/tutorials/JavaPersistenceAPI/article.html durch Copy/Paste in meine eigene Entwicklungsumgebung installiert. Ich habe ein paar unkritische Änderungen vorgenommen, z.b. Ort der DB. Das Beispiel führt JUnit-Tests durch.
Beim ersten Ausführen der JUnit-Tests laufen alle Tests erfolgreich durch. Ab dem zweiten Versuch schlägt der Test checkFamily fehlt. Wenn ich die Datenbank lösche funktioniert wieder der erste Test, jeder weitere schlägt fehl.
Wenn ich mir die Tabelle anschaue scheint die Beziehung der Personen zur Familiy nicht gespeichert zu werden.
Kann mir jemand sagen warum, bzw. wie ich den Fehler beheben kann?
Nachfolgend die drei Klassen des Beispiels.
Ich habe ein Eclipselink(v2.6))-Beispiel mit Derby(v10.13.1.1) von der Seite http://www.vogella.com/tutorials/JavaPersistenceAPI/article.html durch Copy/Paste in meine eigene Entwicklungsumgebung installiert. Ich habe ein paar unkritische Änderungen vorgenommen, z.b. Ort der DB. Das Beispiel führt JUnit-Tests durch.
Beim ersten Ausführen der JUnit-Tests laufen alle Tests erfolgreich durch. Ab dem zweiten Versuch schlägt der Test checkFamily fehlt. Wenn ich die Datenbank lösche funktioniert wieder der erste Test, jeder weitere schlägt fehl.
Wenn ich mir die Tabelle anschaue scheint die Beziehung der Personen zur Familiy nicht gespeichert zu werden.
Kann mir jemand sagen warum, bzw. wie ich den Fehler beheben kann?
Nachfolgend die drei Klassen des Beispiels.
Java:
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Family {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private int id;
private String description;
@OneToMany(mappedBy = "Family")
private final List<Person> members = new ArrayList<Person>();
public int getId() {
return this.id;
}
public void setId(final int id) {
this.id = id;
}
public String getDescription() {
return this.description;
}
public void setDescription(final String description) {
this.description = description;
}
public List<Person> getMembers() {
return this.members;
}
}
Java:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Job {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private int id;
private double salery;
private String jobDescr;
public int getId() {
return this.id;
}
public void setId(final int id) {
this.id = id;
}
public double getSalery() {
return this.salery;
}
public void setSalery(final double salery) {
this.salery = salery;
}
public String getJobDescr() {
return this.jobDescr;
}
public void setJobDescr(final String jobDescr) {
this.jobDescr = jobDescr;
}
}
Java:
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class JpaTest {
private static final String PERSISTENCE_UNIT_NAME = "people";
private EntityManagerFactory factory;
@Before
public void setUp() throws Exception {
this.factory = Persistence.createEntityManagerFactory(JpaTest.PERSISTENCE_UNIT_NAME);
final EntityManager em = this.factory.createEntityManager();
// Begin a new local transaction so that we can persist a new entity
em.getTransaction().begin();
// read the existing entries
final Query q = em.createQuery("select m from Person m"); //$NON-NLS-1$
// Persons should be empty
// do we have entries?
final int size = q.getResultList().size();
final boolean createNewEntries = q.getResultList().isEmpty();
// No, so lets create new entries
if (createNewEntries) {
Assert.assertTrue(q.getResultList().size() == 0);
final Family family = new Family();
family.setDescription("Family for the Knopfs");
em.persist(family);
for (int i = 0; i < 40; ++i) {
final Person person = new Person();
person.setFirstName("Jim_" + i);
person.setLastName("Knopf_" + i);
em.persist(person);
// now persists the family person relationship
family.getMembers().add(person);
em.persist(person);
em.persist(family);
}
}
// Commit the transaction, which will cause the entity to
// be stored in the database
em.getTransaction().commit();
// It is always good practice to close the EntityManager so that
// resources are conserved.
em.close();
}
@Test
public void checkAvailablePeople() {
// now lets check the database and see if the created entries are there
// create a fresh, new EntityManager
final EntityManager em = this.factory.createEntityManager();
// Perform a simple query for all the Message entities
final Query q = em.createQuery("select m from Person m");
// We should have 40 Persons in the database
Assert.assertEquals(40, q.getResultList().size());
em.close();
}
@Test
public void checkFamily() {
final EntityManager em = this.factory.createEntityManager();
// Go through each of the entities and print out each of their
// messages, as well as the date on which it was created
final Query q = em.createQuery("select f from Family f");
// We should have one family
Assert.assertTrue(q.getResultList().size() == 1);
final Family family = (Family) q.getSingleResult();
final int noOfMembers = family.getMembers().size();
// with 40 persons
Assert.assertEquals(40, noOfMembers);
em.close();
}
@Test(expected = javax.persistence.NoResultException.class)
public void deletePerson() {
final EntityManager em = this.factory.createEntityManager();
// Begin a new local transaction so that we can persist a new entity
em.getTransaction().begin();
final Query q = em
.createQuery("SELECT p FROM Person p WHERE p.firstName = :firstName AND p.lastName = :lastName");
q.setParameter("firstName", "Jim_1");
q.setParameter("lastName", "Knopf_!");
final Person user = (Person) q.getSingleResult();
em.remove(user);
em.getTransaction().commit();
final Person person = (Person) q.getSingleResult();
// Begin a new local transaction so that we can persist a new entity
em.close();
}
}