Hibernate 3Bei diesem Thema hatten wir die Ehre, Gavin King, den Hibernate Lead, zu erleben. Er gab zunächst einen Überblick über die Hibernate 3 Features. Spannend fand ich die Aufteilung in die unterschiedlichen Projekte:
- Die Basic Engine, die Persistenz anhand der bekannten .hbm.xml Files macht.
- Hibernate Annotations, was Persistenz nach den JSR 220 Annotationen umsetzt
- Der Entity Manager ebenfalls nach JSR 220
- Es wird wohl PersistenceManager Plugins für verschiedene Appliaction Server geben.
- Einen EJB 3 Microkernel, der
- Hibernate Tools für Ant und Eclipse
Er ging dann länglich auf das Thema Vererbung ein. Dort gibt es ja zahlreiche Möglichkeiten, Vererbung in Relationen auszudrücken und dann anschließend lustige Problem, darauf performant Queries zu mahcne.
Interessanter war das Thema der Navigation von Relationen. Hier sieht er vier Möglichkeiten:
- Select mit einem Schlüsselwert. Für jeden Wert muss ich dann eine Query machen.
- Select mit In ("Batch"). In diesem Fall kann man eine Query und einige wenige Queries verwenden, um für mehrere Werte die abhängigen Werte zu selektieren.
- Join über die beiden Tabellen: das impliziet allerdings Eager Loading
- Subquery: Erst die eine Tabelle laden und dann von der zweiten Tabelle über einen Join mit der ersten Tabelle die Werte laden.
Das ist schon mal ganz interessant, weil ich auch schon mal an ähnliches Diskussionen mit ähnlichem Ergebnis beteiligt war. Davon getrennt sieht er dann das Thema Eager und Lazy Loading, womit er bis auf Joins auch recht hat.
Diese Sachen soll man in den Quries angeben können, weil sie Use Case spezifisch sind. Auch hier bin ich genau dieser Meinung.
Mit FilterEin cooles Feature sind Filter. Damit ist es möglich, in einer Transaktion die sichtbaren Daten einzuschränken. Damit ist z.B. Historisierung bzw. das Arbeiten auf historischen Daten einfach: Man baut einen Filter, der zum Beispiel an einem Zeitstempel die Daten entsprechend selektiert. Mehrere Filter können kombiniert werden. Die Definition ist in XML an den Klassen. In der Session kann man dann einen Filter aktivieren und auch parametrisieren.
Ein weiteres Thema war Batch Verarbeitung. Dabei geht es zum einen um die Verwendung von JDBC Statement Batching und zum anderen um Delete und Update Operationen, die mit einer SQL artigen Syntax mehrere Datensätze mit nur einer Query ändern können. Bei einigen Sachen kann das sehr schief gehen. Wenn man zum Beispiel Sätze aus einer Tabelle und einer abhängigen Tabelle löscht, wird man zunächst die Abhängigen löschen, die an entsprechenden Sätzen in der anderen Tabelle hängen. Dann kommt die andere Tabelle selbst dran. Wenn dieser letzte Schritt aber z.B. von der Anzahl abhängiger Objekte abhängt, geht das schief, weile diese Anzahl 0 ist und daher kein einziger Datensatz gelöscht werden würde. Hier muss man dann eine temporäre Tabelle verwenden. In Hibernate 3.1 kommt hier noch mehr: Insert as Select (sozusagen das Kopieren von Objekten) und Delete Joins, also Löschen mit abhängigen Tabellen.
FazitDas sieht recht vielversprechend aus. Hibernate wird ja heute schon breit genutzt. Die Query Features sind genau jene, die ich auch erwartet hätte. Die Batch Sachen sind zum Teil sinnvoll, bei anderen Dingen frage ich mich, warum ich nicht einfach die Kapselung durchbreche und es mit SQL mache. Das ist performanter und möglicherweise auch einfacher. Gerade das Einführen einer temporären Tabelle finde ich sehr unschön.