rollinhand
Björn Berg

Hibernate: Hilfe, mein Class-Mapping funktioniert nicht mehr

04.06.2020
Entwicklung Hibernate

Zuletzt war ich in einem Projekt beschäftigt, dass für seine Persistenz noch auf Hibernate 3.2.0 und Mapping-Dateien (hbm-Dateien) im XML-Format gesetzt hat aus dem sich auch persistente Klassen generieren lassen. Mit dem zunächst sanften Upgrade auf Hibernate 3.6.10 konnten persistente Klassen nicht mehr über die Klasse Configuration gefunden werden. Oups! Was war zu tun?

In vielen Legacy-Projekten mit Hibernate gibt es die berühmt berüchtigte Klasse HibernateUtil, die bspw. genutzt wird die Konfiguration einzulesen, die SessionFactory zur Verfügung zu stellen und sonstige Funktionalitäten, die von einer Utility-Klasse erwartet werden.

Unter anderem auch die Möglichkeit, dass aus dem kanonischen Namen einer Klasse die Mapping-Informationen aufgelöst werden können:

Configuration cfg = Configuration.configure();
String className = "org.kivio.depot.Aktie";
PersistentClass cls  = cfg.getClassMapping(className); 
Table tbl = cls.getTable();

Seit Hibernate 3.6 liefert cfg.getClassMapping einen Null-Wert zurück und beim Debuggen stellt sich heraus, dass die zugrunde liegende Map in der Klasse Configuration keine Werte enthält. Das bedeutet, dass beim Erzeugen der Configuration die Mappings nicht mehr erzeugt bzw. übersetzt werden.

Damit dies auch mit neueren Versionen von Hibernate funktioniert, sind die Mappings explizit zu erzeugen. Die Übersetzung aus den Mapping-XML-Dateien benötigt einen Moment und da der Trend zu Annotationen-basierter Programmierung geht, wurde diese für die Initialisierung aufwändige Funktionalität aus dem automatischen Prozess entfernt.

Damit die Mappings auch weiterhin über getClassMapping abgerufen werden können, ist die obige Code-Passage um die Anweisung cfg.buildMappings() zu ergänzen.

Configuration cfg = Configuration.configure();
cfg.buildMappings();    // call explicit
String className = "org.kivio.depot.Aktie";
PersistentClass cls  = cfg.getClassMapping(className); 
Table tbl = cls.getTable();

Dadurch verlängert sich die Initialisierung und die Erstellung der Konfiguration, im Anschluss stehen die Mapping-Informationen allerdings wieder programmatisch zur Verfügung.

Kommentar

Du möchtest diskutieren oder einen Kommentar zu dem Beitrag hinterlassen?

Dieser Blog hat keine öffentliche Kommentarfunktion, aber ich freue mich jederzeit über eine Mail mit kritischen Anmerkungen, Feedback oder auch einfach nur Lob an meine Mail-Adresse rollin.hand[@]gmx.de.