Hibernate version:
3.2.4.sp1
Name and version of the database:
postgres8.4
Hallo,
beim Testen mit TestNG 5.7 im Zusammenspiel mit Hibernate v3.2.4 bin ich auf ein Problem gestossen. Irgendwie scheint die durch TestNG gestartet Testumgebung (embedded JBoss) sich beim Auflösen von Polymorhiebeziehungen anders zu verhalten, als bei einem seperaten JBoss-Server (4.2.2.GA). Das Problem ist das Auftreten einer ClassCastException beim Select in der Testumgebung, obwohl ein Test auf dem Develop-System keine Exception wirft.
Hier die Klassenstruktur
Code:
@Entity
@Table(name="tarifdatenbasis", schema="tarifedaten")
public class Tarifdaten extends DBBasis{
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY,
optional = false)
@JoinColumn(name="buchhaltung",nullable = false)
protected Buchhaltung buchhaltung;
.
.
.
}
@Entity
@Table(name="phv_tarifdaten", schema="tarifedaten")
public class PHVTarifdaten extends Tarifdaten {
}
//member buchhaltung wird geerbt
}
@Entity
@Table(name="Buchhaltung", schema="buchhaltungen")
@Inheritance(strategy=InheritanceType.JOINED)
public class Buchhaltung extends DBBasis{
.
.
.
}
@Entity
@Table(name ="phv_buchhaltung", schema="buchhaltungen")
public class PHVBuchhaltung extends Buchhaltung {
.
.
.
}
Hier die Testmehtoden:
Hinweis: die saveHRVTarifdaten-Testmethode wird ohne Fehler ausgeführt
die generate-Methode garantiert, dass nur Buchhaltungs-Objekte vom Typ THVBuchhaltung intern erzeugt werden - die Zeile
Code:
HRVBuchhaltung buch = hrvtarifdaten.getBuchhaltung()
liefert ja auch kein Fehler.
im Testklassen-Member this.objid_tarifdatenHRV1 wird die HRVTarifdaten-ID abgelegt.
Code:
@Test(groups="entitysavetest")
public void saveHRVTarifdaten() throws Exception {
Tarif tarif = tarifmng.generateTarif("HRV");
assertNotNull(tarif);
HRVTarifdaten hrvtarifdaten =tarifmng.generateHRVTarifdaten(tarif);
assertNotNull(hrvtarifdaten);
HRVBuchhaltung buch = hrvtarifdaten.getBuchhaltung();
assertEquals(true,
this.tarifmng.saveOrUpdate(hrvtarifdaten).booleanValue());
assertEquals(obj, hrvtarifdaten.toString());
objid_tarifdatenHRV1 = hrvtarifdaten.getObjID();
}
@Test(groups="DATest", dependsOnGroups="entitysavetest", dependsOnMethods="saveHRVTarifdaten")
public void findHRVTarifdaten() throws Exception {
HRVTarifdaten hrvtarifdaten=
(HRVTarifdaten)tarifmng.find(this.objid_tarifdatenHRV1);
assertNotNull(hrvtarifdaten);
HRVBuchhaltung buch = hrvtarifdaten.getBuchhaltung();
assertNotNull(buch);
}
Das Speichert funktionierte tadellos - die Daten in der DB sind alle Korrekt vorhanden und in den reichtigen Spalten wiederzufinden.
Nach der Ausführung des Tests bekommen ich folgende Fehlermeldung:
[testng] PASSED: savedoubleTarifdatenTest
[testng] FAILED: findHRVTarifdaten
[testng] java.lang.ClassCastException: org.sis.assek.orm.entity.buchhaltung.Buchhaltung_$$_javassist_38
[testng] at org.sis.assek.orm.entity.tarifedaten.HRVTarifdaten.getBuchhaltung(HRVTarifdaten.java:274)
[testng] at org.sis.assek.ngtests.TestTarifdatenmanager.findHRVTarifdaten(TestTarifdatenmanager.java:243)
So wie ich das sehe kann in der Testumgebung Hibernate nicht mehr den richtigen Typ (HRVBuchhaltungs) beim Select/Find wiederherstellen. Im Developsystem (seperater JBoss + Hibernate 3.2.4.sp1) wird der richtige Buchhaltungstyp wieder hergestellt.
Waran kann dieses Unterschiedliche Verhalten liegen? Ich finde es nicht gerade beruhigent, wenn sich das Testsystem anderes verhält - das macht die Test auch irgendwie sinnlos.
Gruß Hendrik