Mit Hibernate aus JUnit ein DB-Schema erzeugen

dmike

Bekanntes Mitglied
Hallo,



ich habe annotierte Klassen und möchte nun einen kleinen Intergrations-Testcase gegen einen in-memory HSQLDB schreiben.

In der setup-Methode des Test-Case schreibe ich das Folgende

Code:
        AnnotationConfiguration cfg = new AnnotationConfiguration();
        ....
        [B]cfg.addAnnotatedClass(de....Blah1.class);
        cfg.addAnnotatedClass(de....Blah2.class)[/B]

        //schema export
        SchemaExport schemaExport = new SchemaExport(cfg);
        schemaExport.create(true, true);



Was mich stört ist der FETT markierte Abschnitt, wo man ständig darauf achten muss, dass man ja auch alle Klassen benennt.

Kann ich Hibernate nicht einfach mitteilen, wo sich die annotierten Klassen befinden, so dass ich mir den wiederholten Aufruf von

Code:
cfg.addAnnotatedClass(...)


sparen kann?
 
Warum erzeugst du die Konfig komplett per Java im Test?
Wäre es nicht einfacher, für die Integrationstests eine eigene persistence.xml zu nutzen? Vorrausgesetzt diese Konfig ist immer gleich für deine ItTests. maven zB. bietet Unterstützung für sowas, welches Buildsystem nutzt du denn?

Hast du DBUnit schon gefunden?
 
Warum erzeugst du die Konfig komplett per Java im Test?
Sorry, das war nur um das Problem, zu demonstrierenl 🙂

Ich habe tatsächlich eine hibernate.dev.hsql.cfg.xml. Dort stehen dann alle Klassen aufgelistet

Code:
<mapping class="de....blah.class">
.
.
.


Ok, vielleicht doch noch etwas mehr Hintergrund.. Also ich habe einen kleine Java-App geschrieben. Die fungiert quasi als Bootstrap-Prozess, soll bedeuten wenn ich sie starte liest sie diese hibernate.dev.hsql.cfg.xml und erzeugt mir mit Hilfe von hibernate von Scratch eine frische Datenbank für das Projekt (postgresql) mit verschiedenen DB-Usern und halt dem DB-Schema.

Leider enthält diese hibernate.dev.hsql.cfg.xml eben auch diese vielen <mapping class...> Abschnitte und die würde ich gerne durch etwas einfaches ersetzen. Wie z.B. <mapping package="de.package..."> Hibernate soll also gleich in dem angegebenen Package nach den annotierten Klassen suchen. Ich mein es wäre doch das einfachste oder? Wie schnell hat man ansonsten eine neue oder geändert Klasse in dem Mapping vergessen?


Hast du DBUnit schon gefunden?
Ja, aber das würde ich dann eher für komplexere Szenarien benutzen. Es wird aber später auf jeden Fall kommen.
 
Ok, vielleicht doch noch etwas mehr Hintergrund.. Also ich habe einen kleine Java-App geschrieben. Die fungiert quasi als Bootstrap-Prozess, soll bedeuten wenn ich sie starte liest diese hibernate.dev.hsql.cfg.xm und erzeugt mir mit Hilfe von hibernate von Scratch eine frische Datenbank für das Projekt (postgresql) mit verschiedenen DB-Usern und halt dem DB-Schema.

Leider enthält diese hibernate.dev.hsql.cfg.xml eben auch diese vielen <mapping class...> Abschnitte und die würde ich gerne durch etwas einfaches ersetzen. Wie z.B. <mapping package="de.package..."> Hibernate soll also gleich in dem angegebenen Package nach den annotierten Klassen suchen. Ich mein es wäre doch das einfachste oder? Wie schnell hat man ansonsten eine neue oder geändert Klasse in dem Mapping vergessen?
Wieso ersetzen?

Wozu ist ein Integrationstest gut, der eine andere Konfig tested? Also mit weniger Entites, wenn ich dich richtig verstanden habe.

Ob Hibernate/JPA die annotierten Entity Klassen selber findet ist eine Frage der Hibernate/JPA Konfig, hat noch nix mit dem schreiben von ItTests zu tun.

Was genau willst du denn testen?
 
Wieso ersetzen?

Wozu ist ein Integrationstest gut, der eine andere Konfig tested? Also mit weniger Entites, wenn ich dich richtig verstanden habe.

Mißverständnis: Mit ersetzen war gemeint, dass ich nicht für jede einzelne Entity einen <mapping class=""> Tag in die Konfiguration schreiben will.

Ich möchte Hibernate einfach nur zeigen wo die annotierten Klassen liegen (in welchem Package z.B.) und dann soll Hibernate mir daraus das Schema erstellen.


Ob Hibernate/JPA die annotierten Entity Klassen selber findet ist eine Frage der Hibernate/JPA Konfig, hat noch nix mit dem schreiben von ItTests zu tun.
Was genau willst du denn testen?
Lassen wir erstmal das Thema Testen. Mir gehts ja erst mal nur darum, dass ich meine hibernate Konfiguration vereinfache, in dem Sinn wie ich es oben beschrieben habe.

Denn ich habe momentan verschiedene hibernate-konfigurationen (für in-memory tests, für postgresql tests, für ...) und alle enthalten die <mapping class=""> Abschnitte redundant.

Hoffentlich ist meine Beschreibung klarer geworden.
 
Also wenn ich das richtig verstehe, dann kann Hibernate nur bei Einsatz von JPA selbstständig nach annotierten Klassen scannen. Wenn ich pures Hibernate benutze dann muss ich tatsächlich jede Klasse einzeln mappen, was ein ziemlich PITA ist.
 

Neue Themen


Zurück
Oben