Transaktionsverwaltung im Hibernate mit DAO Design Pattern

7

Ich habe viele Tabellen, für jede Tabelle haben wir DAO Interface und DAOImplementation Klasse.

Beispiel DAO Schnittstelle

%Vor%

Beispiel DAOImplementation-Klasse

%Vor%

Beispiel Hauptmethode

%Vor%

Nun, meine Frage ist, wie gehe ich mit Transaktion in DAOImpl's um?  Soll ich Session Object als Parameter für jeden DAOImpl übergeben oder gibt es einen besseren Ansatz?

    
LMK 27.11.2014, 11:51
quelle

4 Antworten

10

Ich würde dringend empfehlen, das Rad nicht neu zu erfinden; Verwenden Sie vorhandenen, robusten und getesteten Code.

Die Kommentare haben bereits AOP und das Spring-Framework erwähnt. Dies ist der Weg zu gehen. Das Spring-Framework hat sogar ein Teilprojekt namens Spring Data , mit dem Sie Ihre Finder-Methoden (wie findByCancelPolicyData ) in definieren können eine deklarative Art und Weise.

Dies erspart Ihnen viel Arbeit.

Wenn Sie aus irgendeinem Grund Spring nicht nutzen wollen / dürfen, können Sie die erstaunlich gute Dokumentation des Basis-Frameworks und der erwähnten Spring Data lesen, um viele gute Ideen bezüglich der Transaktion (via AOP) zu erhalten ), Wiederverwendung von Code (über generische DAOs) oder API-Design. Verpassen Sie nicht diese Lektüre.

    
Hille 27.11.2014 13:17
quelle
7

Die Verwendung von Spring ist wahrscheinlich der beste Weg, die Transaktionsverwaltung hinzuzufügen. Sie können dies jedoch auch ohne Neuberechnung Ihrer gesamten Codebasis durchführen.

Was Sie tun müssen, ist die folgende Konfiguration:

%Vor%

Ihre DAOs sollten auf die Sitzung zugreifen über:

%Vor%

Sie müssen Transaktionsgrenzen in Ihrer Service-Schicht noch deklarieren:

%Vor%

Sowohl DAO1 als auch DAO2 verwenden die gleiche Hibernate-Sitzung und dieselbe Transaktion.

Um diese ausführliche Handhabung von Transaktionsmanagement-Codes zu vermeiden, können Sie ein einfaches TransactionManager-Dienstprogramm schreiben, beispielsweise:

%Vor%

Und so sieht ein Service aus:

%Vor%     
Vlad Mihalcea 02.12.2014 11:20
quelle
2

Wenn Sie eine Webanwendung haben und in Ihrem Projekt keine Spring-Funktion für session mgmt verwenden, würde ich vorschlagen, den Interceptor zu verwenden, um die Session-Handling-Logik außerhalb Ihres DAO zu trennen. Sie können unten erwähnten Artikel für das gleiche beziehen. Beachten Sie, dass mit diesem Ansatz bestimmte CONs verbunden sind, aber wir haben herausgefunden, dass dies der bequemste Weg in unserem Fall ist.

Sitzung im Ansichtsmuster öffnen

Im Folgenden sehen Sie, wie wir Open Session im View-Muster mit Generics für Ihre Klasse verwenden,

%Vor%

In obigem Code wird eine Speichermethode verwendet, die in GenericHibernateDAOImpl implementiert ist, wie unten gezeigt. Sie können Google für GenericHibernateDAOImpl Klasse und greifen Sie es, die Anzahl der zusätzlichen Methoden für grundlegende Operationen hat.

%Vor%

Nun zurück zu Ihrer Frage, wo Sie die Sitzung erhalten, wie oben gezeigt. Die GenericHibernateDAOImpl-Sitzung wird von der singleton sessionFactory über die getCurrentSession-Methode abgerufen. Beachten Sie, dass Sie eine aktive Transaktion ausführen müssen, bevor Sie die aktuelle Sitzung abrufen, die Sie in Ihrem Interceptor zur Verfügung stellen können (Link am Anfang dieses Beitrags).

Bitte lassen Sie es mich wissen.

    
Shaikh Mohammed Shariq 02.12.2014 13:00
quelle
1

Sie müssen keine Frameworks verwenden, das CancelPolicy-Objekt ist das Hauptobjekt und es sollte über eine Hibernate-Funktion verfügen (Kaskade). Überprüfen Sie den Link ( Kaskadierender Lebenszyklus )

Damit füllen Sie das CancelPolicy-Objekt mit allen erforderlichen Relationen und sagen save, es wird das gesamte Diagramm der zugehörigen Objekte gespeichert.

    
Bassel Kh 01.12.2014 13:31
quelle