2017-01-25 4 views
2

Ich beginne ein Projekt mit Spring MVC und Hibernate und ich verstehe nicht die Best Practices für den Datenzugriff.Eine Sitzung pro Anfragemuster mit Spring MVC und Hibernate

Nach einiger Forschung, ich verstehe, dass wir verschiedene Schichten (DAO-Schicht, Service-Schicht) verwenden sollten, um die Geschäftslogik von den tatsächlichen Datenbankinteraktionen zu trennen.

Allerdings weiß ich nicht, wie ich garantieren kann, dass nur eine Hibernate-Sitzung für jede HTTP-Anfrage generiert wird.

Zum Beispiel: Angenommen, ich habe eine Webseite für ein Restaurant, die zwei Menüs anzeigt: ein Tagesmenü und die speziellen Gerichte des Küchenchefs. Beide Menüs werden auf derselben Webseite angezeigt.

ich dort zwei Dienste wäre vorstellen würde:

DealsOfDayService - erhält alle Gerichte, die auf Angebote des Tages sind

ChefSpecialsService - Specials Liste erhält alle Gerichte auf Kochs

Wenn jedoch ein Benutzer diese Seite anfordert. Der Controller würde beide Dienstmethoden aufrufen, um die erforderlichen Daten für die Webseite abzurufen. Jedes Mal, wenn eine Servicemethode aufgerufen wird, wird jedoch eine neue Hibernate-Sitzung erstellt, verwendet und geschlossen.

Ich frage mich, wie ich nur eine Hibernate-Sitzung verwenden kann, um beide Listen zu erhalten, da das Öffnen einer Sitzung für jeden Dienstvorgang wirklich teuer erscheint. (Ich denke, ich frage, ob es eine Möglichkeit gibt, Serviceaufrufe zu verketten, da im zweiten Dienst irgendwie die Sitzung verwendet wird, die in der ersten Dienstmethode erstellt wurde, so dass keine neue Sitzung erstellt werden muss).

Wenn mir jemand in die richtige Richtung zeigen könnte, wie man mit diesem Problem umgeht, würde es sehr geschätzt!

+0

Verwenden Sie Spring Boot und vertrauen Sie einfach seiner Transaktionsverwaltung. (Im Allgemeinen vorzuziehen, die JPA-Persönlichkeit auf Hibernate in jedem Fall zu verwenden.) – chrylis

Antwort

2

Sie können OpenSessionInViewFilter in Spring Framework verwenden. Dies entspricht Ihrer Anforderung. Dieser Filter erweitert OncePerRequestFilter, wodurch sichergestellt wird, dass die Hibernate-Sitzung einmal pro HTTP-Anforderung geöffnet wird.

This Beitrag wird Ihnen helfen, den Filter zu konfigurieren.

+0

Ich werde das untersuchen. Vielen Dank :) – Solace

Verwandte Themen