Hibernate, Spring, Persistenz
Auf
InfoQ gibt es einen Artikel über die richtige Abstraktion in der Persistenz-Schicht. Leider werden dort mehrere Dinge vermischt.
Zunächst gibt es die
Kritik, dass man keine Abstraktion über eine Lösung wie Hibernate bauen sollte, weil man sowieso irgendwann proprietäre Features nutzen muss. Dem stimme ich zu, für Performance-Tuning sind solche Sachen unablässig. Warum allerdings Spring's HibernateTemplate dort als eine schlechte Abstraktion aufgeführt wird, ist mir unklar: Es bietet vollen Zugriff auf die gesamte Mächtigkeit von Hibernate, nur eben eleganter. Und die mangelnde Definition der Semantik des HibernateTemplates ist ebenfalls komisch: Es gibt Dokumentation und im Zweifelsfall auch Code, den man anschauen kann. Übrigens schreitet der Artikel dann fort und behauptet, JPA sei die einzig sinnvolle Abstraktion. Schade nur, dass JPA nicht - wie im Artikel auch angesprochen - alle Features aller Implementierungen standardisiert (was ein Standard nie tut) - hier wird Spring in Zukunft als "Vereinheitlicher" dienen.
Dieser
Artikel weißt der Spring Unterstützung für Hibernate immerhin einen Sinn zu, sieht aber auch das HibernateTemplate als nicht sinnvoll, leider ohne Begründung. Es bietet eben einheitliche Exceptions für JDBC und Hibernate, meistens sehr kompakten Code und außerdem ein automatisches Aufräumen der Ressourcen. Warum man das nicht haben wollen würde, ist mir unklar, aber dann kann man immer noch Transaktionen von Spring steuern lassen und sich die Session holen, wie in den Artikeln ausgeführt. Spring zwingt niemanden zu seinem Glück.
Viel interessanter und
hier leider nur in Ansätzen ausgehführt, ist jedoch die Frage, wie man überhaupt mit der Persistenz umgehen will. Heutzutage ist Hibernate meistens das Werkzeug der Wahl. Hibernate ist jedoch kein triviales Stück Technologie, d.h. es vereinfachte Dinge nicht bedingt. Wenn man komplexe OO-Logik hat, wird man sich ohne Hibernate schwer tun, sie zu implementieren. Dennoch hat man oft Schwierigkeiten, Hibernate dazu zu überreden, die "richtigen" SQL Statements abzusetzen. Warum dann nicht das SQL selber schreiben? Auch Argumente wie Caching ziehen hier nur bedingt, da man mit iBATIS oder einer AOP-Cache-Lösung auch dies leicht nachbauen kann. Das einzige Argument gegen ein solches Vorgehen ist, wenn man komplexe Logik hat, so dass man von dem transparenten Nachladen von Daten (Lazy Loading) profitiert.
Die eigentliche Frage sollte also sein, ob O/R-Mapper wie Hibernate im Moment nicht überbewertet werden. In vielen Situationen sind andere Lösungen wie Springs JdbcTemplates oder iBATIS einfacher und effizienter. Man muss ja O/R Mapper nicht gleich als ein
Vietnam bezeichnen.