# myFaces und Hibernate Session Handling



## y0dA (2. Apr 2008)

Hi!
Was mich schon länger beschäftigt ist wie man am besten das Hibernate Session Thema bei myFaces angeht. Also wie handhabt ihr das Ganze? Bspw mittels einem Filter welche eine Session für die nächste Interaktion aufmacht oder öffnet und schließt ihr die Session vor u nach einer Abfrage (= kein Lazyloading möglich)?

Wäre hilfreich wenn ihr mir hierbein ein paar Tipps geben könntet.

mfg


----------



## ms (2. Apr 2008)

Sofern auch die Datenbankzugriffe in der selben VM laufen wie der UI-Teil mittels Open-Session-In-View-Filter.
Ansonsten siehe die Problematik ein paar Beiträge weiter unten.

ms


----------



## y0dA (2. Apr 2008)

Open-Session-In-View-Filter
Wie sieht der aus?

mfg

btw welchen Thread meinst du?


----------



## SnooP (2. Apr 2008)

Google mal nach Open-Session-In-View - da landest du auf die entsprechende Doku auf den Hibernate-Seiten - die ist ganz aussagekräftig.

Letztlich brauchst du eine HibernateUtil-Klasse, die via ThreadLocal-Variable die Session oder auch die akt. Transaction speichert und die Verbindung aufbaut etc...

In einem Servlet-Filter schließt du die Session wieder nach bzw. bei Auslieferung des Response.
Also Request, Zugriff einer Action auf eine Hibernate-Komponente über HibernateUtil: Session auf... mache ganz viel - Render Response, Fitler macht Session wieder zu.

LazyLoading ist damit passé - weil du bei Webanwendungen den Vorteil eines klar definierten Ablaufs: Request-Response-Zyklus hast.


----------



## byte (2. Apr 2008)

SnooP hat gesagt.:
			
		

> Letztlich brauchst du eine HibernateUtil-Klasse, die via ThreadLocal-Variable die Session oder auch die akt. Transaction speichert und die Verbindung aufbaut etc...


Das ist nicht nötig, wenn man die Session per factory.getCurrentSession() holt. Dann kannst Du einfach in der Hibernate.cfg die Session an den Thread binden.
Open-Session-In-View macht dann ja einfach nur eine Transaktion am Anfang des Requests auf und comittet diese nach dem Rendern der View, womit auch die Session geschlossen wird.


----------



## y0dA (2. Apr 2008)

Und diesen Filter benötige ich wenn ich in der View eine Connection benötige?
Und wenn ihr ganz normal Daten speichert und lädt macht ihr dann einfach an jenen Stellen in der Businesslogik eine Session auf und wieder zu? Mir gehts halt prinzipiell darum dass ich weiß wann ich bzw wie ich dieses Session Thema angehen sollte.


----------



## ms (2. Apr 2008)

Wenn du Spring verwendest gibt es schon einen solchen Filter von dem du nur noch ableiten brauchst um die SessionFactory zu initialisieren.
Im übrigen muss auch im Filter keine Transaktion geöffnet und geschlossen werden. Das könnte man zB dem Servicelayer überlassen.

@y0dA
Du brauchst dich um das Öffnen/Schließen überhaupt nicht mehr kümmern. Einfach nur HibernateUtil.getCurrentSession() aufrufen und du hast deine Session.

ms


----------



## byte (2. Apr 2008)

Mein Kommentar bezog sich auf die reine Verwendung von Hibernate. Mit Spring wirds natürlich noch viel schöner.

Ich habe derzeit zwei Projekte mit Spring & Hibernate laufen (eins mit GWT-Frontend und eins mit Swing-Client). In beiden Fällen habe ich jeweils eine Service- und eine DAO-Schicht. Client kommuniziert nur mit Service. Service macht Transaktion auf und benutzt DAOs für DB-Zugriffe. DAOs benutzen HibernateTemplate (Spring) und kriegen darüber ihre Session. Die Session ist an die Transaktion gebunden und wird beim Commit geschlossen. Transaktion und Session sind also nur auf, solange eine Service-Anfrage läuft. Beim nächsten Aufruf gibts ne neue Session.

KA wie Deine Architektur aussieht, aber vielleicht hilfts Dir ja weiter.


----------

