3 Stimmen

DAO und Service-Schicht in Spring: Sitzungsverwaltung

Verstehe ich die Prinzipien der Verbindung von DAO und Service-Schicht richtig? DAO führt Extraktionen von Basisobjekten durch, z. B. nach ID aus einer Datenbank.

Dienstschicht VERWENDET ein DAO-Objekt und kann MEHR ALS EINE METHODE von DAO in einer Funktion. Die Serviceschicht muss es also:

  1. ein DAO-Implementierungsobjekt instanziieren

  2. so viele Methoden der DAO aufzurufen wie nötig

Wenn eine Dao eine Schnittstelle implementiert, dann muss eine DAO-Schnittstelle eine Methode haben setSessionFactory() ?

Wie man in Spring deklarativ markiert:

  1. DAO-Objekt

  2. Methoden der Dienstebene und die Klasse als Ganzes

so dass es das gibt, was gebraucht wird?

7voto

matt b Punkte 135206

Ich bin überrascht, dass dies noch niemand ausdrücklich erwähnt hat, aber ein implementierungsspezifisches Detail wie setSessionFactory() sollte nicht in Ihrer DAO-Schnittstelle sein. Indem Sie eine Hibernate-spezifische Klasse zu Ihrer DAO-Schnittstelle hinzufügen, binden Sie Ihre DAOs direkt an Hibernate.

Der Zweck der Verwendung von Schnittstellen und Dependency Injection ist es, Ihnen die Möglichkeit zu geben, ein Implementierungsdetail (z. B. welche ORM-Lösung Sie verwenden oder ob Ihre Daten von einem Webdienst oder einer Datenbank stammen) einer Schicht (Ihrer DAO) zu ändern, ohne andere Schichten zu beeinflussen.

Wenn Sie Folgendes hinzufügen setSessionFactory zu Ihrer DAO-Schnittstelle, dann werden alle anderen Schichten, die diese DAO verwenden, darauf aufmerksam und an die Tatsache gebunden, dass der Datenzugriff über Hibernate erfolgt. Dies ist das direkte Gegenteil von dem, was Sie durch die Verwendung von Schnittstellen und Dependency Injection zu erreichen versuchen.

4voto

Jeremy Punkte 21726

Für meine Projekte schreibe ich eine Basisklasse, die eine setSessionFactory() Methode, die alle meine DAOs erweitern. Dann verdrahte ich meine DAOs mit Spring so, dass es die SessionFactory in jede DAO.

Hibernate hat eine SessionFactory.getCurrentSession() Wenn Sie also die SessionFactory in Ihre DAOs aufnehmen und diese Methode verwenden, dann wird der Geltungsbereich der Session wird entsprechend Ihrem Transaktionsverwaltungsmechanismus definiert.

Das heißt, wenn Sie eine Methode als solche haben:

@Transactional
public void doSomething(){
    dao1.makeCall();
    dao2.makeOtherCall();
}

El SessionFactory die Sie in jede DAO injizieren, wenn sie konstruiert wird, wird die gleiche Session . Aber nur für den Umfang dieser Transaktion.

2voto

Bozho Punkte 570413
  • Überlassen Sie die Transaktions- und Sitzungsverwaltung dem Frühjahr (über die eingebauten Transaktionsmanager).
  • Verwenden Sie in Ihren DAOs sessionFactory.getCurrentSession() für den Zugriff auf die Sitzung
  • haben die SessionFactory in die DAO injiziert.
  • DAO im Geltungsbereich haben singleton
  • deklarative Transaktionen verwenden (entweder mit <aop oder mit @Transactional )
  • wird die DAO über eine reguläre Dependency-Injection in die Dienstobjekte injiziert. Auf die gleiche Weise werden die Dienstklassen dort injiziert, wo sie benötigt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X