Schließlich habe ich das empfohlene "Pattern" von Hibernate gemäß dem Buch "Hibernate in Action" umgesetzt. Der Beispielcode ist in CaveatEmptor (HiA-SE) zu finden. Das wichtige ist die Filterung aller Requests über einen Servletfilter, damit die Session in den Views auch noch verfügbar ist, ansonsten müßte man alle Objekte und Collections vorher initialisieren.
Spring schien mir für diesen einen Zweck, wie angemerkt, zu aufwendig.
Man braucht keine Containerabhängigen Features wie JNDI oder ähnliches.
Folgende Komponenten sind also beteiligt:
HibernateSessionFilter kapselt alle Requests und beendet die aktuelle Sitzung:
Code:
... doFilter(...) {
try {
chain.doFilter(request, response);
HibernateUtil.commitTransaction();
} finally {
HibernateUtil.closeSession();
}
}
HibernateUtil managed via ThreadLocal die Session (siehe Beispielcode in CaveatEmptor)
Das
Servlet oder die Action öffnen jediglich die Session, wenn diese gebraucht wird:
Code:
... execute(...) {
try {
HibernateUtil.beginTransaction();
Session hibernateSession = HibernateUtil.getSession();
<do some object/business code>
<give it to your view>
} catch (HibernateException) {
...
}
}
Besten Dank an Werpu und Christian.
Christian: Danke für Eure (HibernateTeam) Geduld mit den immer wiederkehrenden Fragen, Hibernate ist echt toll und Euer Support wirklich tapfer.
Beste Grüße
Thomas
PS: Bleiben noch zwei Fragen offen:
1. Bitte erklärt doch mal kurz Transaktionsdemarkation
2. Ohne jetzt das allzu sehr in die Tiefe treten zu wollen, aber ich liess mir sagen ThreadLocal sei doch ziemlich ineffizient, spielt das Eurer Meinung nach mit neuerem Java keine Rolle mehr, oder sollte man hier bei hohen Anforderungen auch etwas ändern?