EclipseLink Unit-Test Problem (gecachte Daten?)

klaus1985

Mitglied
Hallo,

ich steh ziemlich auf'm Schlauch. In der Datenbank steht alles korrekt, wenn ich Breakpoints setze und mir das anschau. Der Test gibt allerdings völlig andere Werte aus.

{edit}
DB: MySQL;
EclipseLink mit JPA.
{/edit}

Ich hab ein Fahrzeug, dem Protokolleinträge zugeordnet werden können. Das sieht so aus (Methode in der Fahrzeug-Klasse):

Code:
@OneToMany(mappedBy = "fahrzeug", cascade={CascadeType.MERGE, CascadeType.PERSIST})
private Set<Fahrzeugprotokoll> fahrzeugprotokolle;

public void addProtokolleintrag(Typ statusTyp, String bemerkung) {
	Fahrzeugprotokoll prot = new Fahrzeugprotokoll(statusTyp, bemerkung, this, this.einsatz);
	fahrzeugprotokolle.add(prot);
}

Jetzt hab ich 2 Tests geschrieben, um das ganze zu testen. Nach jedem Test wird die DB einmal

Code:
	@After // löschen nach jedem Test
	public void testShutdown() {
		EntityManager em = HibernateUtil.getEntityManager();
		Fahrzeug f = vehicleService.findFahrzeugByRufname(RUFNAME_TESTFAHRZEUG);

		em.getTransaction().begin();
		Query q = em.createQuery("DELETE FROM Fahrzeugprotokoll WHERE fahrzeug = :fahrzeug", Fahrzeugprotokoll.class);
		q.setParameter("fahrzeug", f);
		int res = q.executeUpdate();
		em.getTransaction().commit();
		
		em.close();
	}


	@Test
	public void testA() {
		Fahrzeug f = vehicleService.findFahrzeugByRufname(RUFNAME_TESTFAHRZEUG);
		
		assertTrue(f != null);
		
		EntityManager em = HibernateUtil.getEntityManager();
		em.getTransaction().begin();
		
		f.addProtokolleintrag(Typ.Manuell, "Test 1");
		f.addProtokolleintrag(Typ.Manuell, "Test 2");
		
		em.merge(f);
		em.getTransaction().commit();
		
		f = vehicleService.findFahrzeugByRufname(RUFNAME_TESTFAHRZEUG);
		assertEquals(2, f.getFahrzeugprotokolle().size());
		assertNotNull(f);
	}

	@Test
	public void testB() {
		Fahrzeug f = vehicleService.findFahrzeugByRufname(RUFNAME_TESTFAHRZEUG);
		EntityManager em = HibernateUtil.getEntityManager();
		em.getTransaction().begin();
		f.addProtokolleintrag(Typ.Manuell, "Test 3");

		em.merge(f);
		em.getTransaction().commit();
		
		f = vehicleService.findFahrzeugByRufname(RUFNAME_TESTFAHRZEUG);
		List<Object> all = Arrays.asList(f.getFahrzeugprotokolle().toArray());
		assertEquals(1, all.size());
	}

testA flutscht ohne Probleme, bei testB schlägt die Assertion "assertEquals(1, all.size());" fehlt:
"java.lang.AssertionError: expected:<1> but was:<3>"
Wenn ich rein-debugge, seh ich in der Liste "all" die Einträge "Test 3", "Test 2" und "Test 1". In der DB sind die aber nicht mehr, sondern nur der "Test 3" (was ja auch so korrekt ist). Wo ist das Problem****

Danke schon mal für eure Hilfe!
 
Zuletzt bearbeitet:

Writtscher

Mitglied
Schon einmal das Hibernate sql logging angemacht? Mal die Hibernate Configuration überprüft? Versuch doch, da du sowieso die Tabelle komplett löschst, noch ein @Before and das aufräumen zu machen. Versuche auch mal em.flush() nach merge(..) und schau was passierst.

Aber unbedingt das SQL logging einschalten und schauen was für Sql abgesetzt werden. Auch das Hibernate logging auf Debug setzen hilft manchmal.
 

Neue Beiträge