Das DAO mit Frühling und Überwinterung

Die DAO mit Spring und Hibernate

1. Überblick

Dieser Artikel zeigt, wie manimplement the DAO with Spring and Hibernate macht. Informationen zur Kernkonfiguration für den Ruhezustand finden Sie im vorherigen Artikel zuHibernate 5 with Spring.

2. Keine Frühlingsvorlagen mehr

Starten von Spring 3.0 und Hibernate 3.0.1,the Spring HibernateTemplate is no longer necessary, um die Hibernate-Sitzung zu verwalten. Es ist jetzt möglich,contextual sessions -sessions managed directly by Hibernate zu verwenden und im gesamten Umfang einer Transaktion aktiv zu sein.

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

2.1. Ausnahme Übersetzung ohneHibernateTemplate

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

Ohne die Vorlagethis mechanism is still enabled and activefor all the DAOs annotated with the @Repository Annotation. Unter der Haube wird ein Spring Bean-Postprozessor verwendet, der alle@Repository-Bohnen mit allenPersistenceExceptionTranslator-Bohnen im Spring-Kontext anzeigt.

Beachten Sie, dass bei der Ausnahmeübersetzung Proxys verwendet werden. Damit Spring Proxys um die DAO-Klassen erstellen kann, dürfen diese nicht alsfinal deklariert werden.

2.2. Sitzungsverwaltung im Ruhezustand ohne Vorlage

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

Note
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. Der DAO

Wir beginnen mitthe base DAO – an abstract, parametrized DAO, das die allgemeinen generischen Operationen unterstützt und das wir für jede Entität erweitern können:

public abstract class AbstractHibernateDAO< T extends Serializable >{
   private Class< T > clazz;

   @Autowired
   private SessionFactory sessionFactory;

   public void setClazz(Class< T > clazzToSet) {
      clazz = clazzToSet;
   }

   public T findOne(long id) {
      return (T) getCurrentSession().get( clazz, id );
   }
   public List< T > 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 werden die HibernateSessionFactory direkt in das DAO injiziert und haben die Rolle der Haupt-Hibernate-API über die kontextbezogenenSession, die sie verfügbar machen:

this.sessionFactory.getCurrentSession();

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

Betrachten wir nunan example implementation of this DAO für eineFoo-Entität:

@Repository
public class FooDAO extends AbstractHibernateDAO< Foo > 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, sich nicht mehr auf Vorlagen für die DAO-Ebene zu verlassen, sowie mögliche Fallstricke bei der Konfiguration von Spring für die Verwaltung von Transaktionen und die Ruhezustands-Sitzung wurden erörtert. Das Endergebnis ist eine schlanke, saubere DAO-Implementierung, bei der die Kompilierzeit fast nicht von Spring abhängt.

Die Implementierung dieses einfachen Projekts finden Sie inthe github project.