Das DAO mit Frühling und Winterschlaf

1. Übersicht

Dieser Artikel zeigt, wie Sie das DAO mit Spring und Hibernate implementieren . Informationen zur Kernkonfiguration von Hibernate finden Sie im vorherigen Artikel zu Hibernate 5 mit Spring.

2. Keine Frühlingsvorlagen mehr

Ab Spring 3.0 und Hibernate 3.0.1 ist Spring HibernateTemplate nicht mehr erforderlich , um die Hibernate-Sitzung zu verwalten. Es ist jetzt möglich, kontextbezogene Sitzungen zu verwenden - Sitzungen, die direkt von Hibernate verwaltet werden und im gesamten Umfang einer Transaktion aktiv sind.

Infolgedessen empfiehlt es sich jetzt, die Hibernate-API direkt anstelle der HibernateTemplate zu verwenden. Dadurch wird die Implementierung der DAO-Schicht effektiv von Spring vollständig entkoppelt.

2.1. Ausnahmeübersetzung ohne HibernateTemplate

Die Übersetzung von Ausnahmen war eine der Aufgaben von HibernateTemplate - die Übersetzung der Ausnahmen für den Ruhezustand auf niedriger Ebene in allgemeine Spring-Ausnahmen auf höherer Ebene.

Ohne die Vorlage, wird dieser Mechanismus noch freigegeben und aktiv für alle die DAOs mit der kommentierten @Repository Anmerkung. Unter der Haube wird ein Spring-Bean-Postprozessor verwendet, der alle @ Repository- Beans mit dem gesamten PersistenceExceptionTranslator aus dem Spring-Kontext berät .

Beachten Sie, dass bei der Ausnahmeübersetzung Proxys verwendet werden. Damit Spring Proxys für die DAO-Klassen erstellen kann, dürfen diese nicht als endgültig deklariert werden .

2.2. Sitzungsverwaltung im Ruhezustand ohne Vorlage

Als die Hibernate-Unterstützung für kontextbezogene Sitzungen herauskam, war die HibernateTemplate im Wesentlichen veraltet. Tatsächlich hebt der Javadoc der Klasse jetzt diesen Aspekt hervor (fett vom Original):

HINWEIS: Ab Hibernate 3.0.1 kann der Transaktions-Hibernate-Zugriffscode auch im einfachen Hibernate-Stil codiert werden. Daher sollten Sie bei neu gestarteten Projekten stattdessen den Standard-Hibernate3-Stil zum Codieren von Datenzugriffsobjekten verwenden, der auf {@link org.hibernate.SessionFactory # getCurrentSession ()} basiert.

3. Das DAO

Wir beginnen mit dem Basis-DAO - einem abstrakten, parametrisierten DAO, das die allgemeinen generischen Operationen unterstützt und das wir für jede Entität erweitern können:

public abstract class AbstractHibernateDAO{ private Class clazz; @Autowired private SessionFactory sessionFactory; public void setClazz(Class clazzToSet) { clazz = clazzToSet; } public T findOne(long id) { return (T) getCurrentSession().get( clazz, id ); } public List findAll() { return getCurrentSession() .createQuery( "from " + clazz.getName() ).list(); } public void save(T entity) { getCurrentSession().persist( entity ); } public T update(T entity) { return (T) getCurrentSession().merge( entity ); } public void delete(T entity) { getCurrentSession().delete( entity ); } public void deleteById(long id) { final T entity = findOne( id); delete( entity ); } protected final Session getCurrentSession(){ return sessionFactory.getCurrentSession(); } }

Einige Aspekte sind hier interessant - wie bereits erwähnt, erweitert das abstrakte DAO keine Spring-Vorlage (z. B. HibernateTemplate ). Stattdessen wird die Hibernate SessionFactory direkt in das DAO eingefügt und hat über die kontextbezogene Sitzung , die sie verfügbar macht, die Rolle der Haupt-Hibernate-API :

this.sessionFactory.getCurrentSession ();

Beachten Sie außerdem, dass der Konstruktor die Klasse der Entität als Parameter empfängt, der in den generischen Operationen verwendet werden soll.

Schauen wir uns nun eine Beispielimplementierung dieses DAO für eine Foo- Entität an:

@Repository public class FooDAO extends AbstractHibernateDAO implements IFooDAO{ public FooDAO(){ setClazz(Foo.class ); } }

4. Fazit

Dieser Artikel befasste sich mit der Konfiguration und Implementierung der Persistenzschicht mit Hibernate und Spring.

Die Gründe, warum Sie sich nicht mehr auf Vorlagen für die DAO-Schicht verlassen müssen, sowie mögliche Fallstricke bei der Konfiguration von Spring für die Verwaltung von Transaktionen und der Ruhezustandssitzung wurden erörtert. Das Endergebnis ist eine leichte, saubere DAO-Implementierung, bei der Spring fast keine Kompilierungszeit benötigt.

Die Implementierung dieses einfachen Projekts finden Sie im Github-Projekt.