• Hibernate ist ja sowas von faul

    Das O/R-Mapping von Hibernate ist eine feine Sache, insbesondere bei Relationen: Hat eine Klasse Schrank eine 1:n-Beziehung mit einer Klasse Schublade, dann liefert mir einSchrank.getSchubladen() eine Collection von Objekten der Klasse Schublade. So sieht es jedenfalls aus, aber das muss man mit Vorsicht genießen.In Wirklichkeit handelt es sich um Proxy-Objekte, die mir Hibernate unterschiebt. Diese Objekte tun nur so, als wären sie Schubladen. Das Framework muss nämlich vermeiden, durch das Auflösen von Relationen im Endeffekt die gesamte Datenbank einzulesen. Ein gutes Beispiel dafür ist ein Familienstammbaum, in dem alle Personen durch Eltern-, Kind- oder sonstige Relationen verbunden sind. Würde Hibernate die alle auflösen, nur weil ich von einer Person den Namen haben will, hätte ich sofort die ganze Familiengeschichte am Hals.

    Deshalb realisiert Hibernate mittels der erwähnten Proxyobjekte eine sog. "Lazy initialization": Bei der Initialisierung abhängiger Objekte schiebt Hibernate das Nachladen der Daten so lange auf, bis sie von der Anwendung wirklich abgefragt werden. Das SELECT auf die Schubladen-Tabelle wird nicht schon bei einSchrank.getSchubladen abgesetzt, sondern erst, wenn ich auf die Daten einer dieser Schubladen zugreife.

    Und da wartet eine Falle: Dieses "Nachladen auf den letzten Drücker" muss in der gleichen Session passieren wie das Laden des übergeordneten Objekts. Wurde die Session nach getSchubladen geschlossen, können die Daten einzelner Schubladen nicht mehr abgefragt werden. Hibernate wirft dann eine LazyInitializationException.

    Dieses Problem löst man am besten durch eine gekapselte Sessionverwaltung, die für die Anwendung transparent eine Hibernate-Session erzeugt und diese am Leben hält.

  • Stoisch

    Carolin beklagt sich regelmäßig, dass ich so wenig Emotionen nach aussen lasse. Vielleicht hatte ich darin einfach das falsche Vorbild

  • Klare Worte

    Es ist ein gutes Gefühl, dass es Kollegen gibt, mit denen man Klartext reden kann. Egal, ob man mit ihnen ein Problem hat oder umgekehrt. Und bei denen man weiss, dass man selbst nach unangenehmen Gesprächen das Thema mit einer Vereinbarung abhaken darf, anstatt dass einem das Thema noch ewig nachschleicht.

  • Daten überwintern

    Auf meiner Forschungsreise durchs Java-Land habe ich jetzt die Anwendung von Hibernate gelernt. Es handelt sich dabei um ein Persistence framework, also um eine Softwareschicht zur dauerhaften Datenspeicherung in Datenbanken. Das Tolle an Hibernate ist, wie die Zugriffe auf die Datenbank gekapselt werden.Zunächst programmiert man einfache Javabeans (auch POJO(Plain Old Java Object) genannt), also gewöhnliche Klassen mit privaten Attributen und entsprechenden Setter- und Getter-Methoden. Zum Speichern eines Objekts übergibt man dieses einfach an eine Hibernate-Session, die für die entsprechende Datenbank konfiguriert ist. Auch das Lesen von Daten erfolgt nicht durch SQL-Abfragen, sondern durch Methodenaufrufe der POJOs oder der Hibernate-Session.

    Und woher weiss Hibernate, welche Tabellen und Spalten den Objektattributen zugeordnet sind? Aus einfachen XML-Dateien, die diese Abbildung beschreiben. Ein Beispiel: Objekte der Klasse Person kommen in die Tabelle PERSON, wobei die Attribute firstname und lastname in die gleichnamigen Spalten der Tabelle geschrieben werden sollen. Zusätzlich gibt es einen Primärschlüssel PERSON_ID, der automatisch erzeugt werden und dem Attribut id zugeordnet sein soll:

    Das wars schon. Und richtig cool wird es, wenn man diese Mappingdateien gar nicht von Hand pflegt, sondern durch Xdoclet automatisch aus Kommentar-Attributen der Javaklasse erzeugen lässt. So kann man sich voll auf die Geschäftslogik seiner Klassen konzentrieren, anstatt sich mit SQL rumzuschlagen.

  • Ausgesperrt

    Lieber Kollege Bleek, man muss sich gar nicht viel Mühe geben, um im Firmen-VPN gesperrt zu werden. Da mir das vorhin genau nach der Hälfte einer unaufschiebbaren Datenbank-Wartung passiert ist, sitze ich jetzt in Durlach. Und habe viel Zeit, um Blogeinträge zu machen, J2EE zu üben und "Firefly" anzuschauen...