Die DAO mit JPA und Spring

Das DAO mit JPA und Spring

1. Überblick

Dieser Artikel zeigt, wie manimplement the DAO with Spring and JPA macht. Informationen zur JPA-Kernkonfiguration finden Sie unterthe article about JPA mit Spring.

2. Keine Frühlingsvorlagen mehr

Ab Spring 3.1 sind dieJpaTemplate und die entsprechendenJpaDaoSupporthave been zugunsten der Verwendung der nativen Java Persistence API veraltet.

Außerdem sind beide Klassen nur für JPA 1 relevant (aus dem Javadoc vonJpaTemplate):

Beachten Sie, dass diese Klasse nicht auf JPA 2.0 aktualisiert wurde und dies niemals tun wird.

Infolgedessen wird jetzt empfohlen,use the Java Persistence API directly anstelle vonJpaTemplate zu verwenden.

2.1. Ausnahmeübersetzung ohne Vorlage

Eine der Verantwortlichkeiten vonJpaTemplate warexception translation - die Übersetzung der Ausnahmen auf niedriger Ebene in die allgemeinen Spring-Ausnahmen auf höherer Ebene.

Ohne die Vorlageexception translation is still enabled and fully functional für alle mit@Repository kommentierten DAOs. Spring implementiert dies mit einem Bean-Postprozessor, der alle@Repository-Bohnen mit allenPersistenceExceptionTranslator im Container anzeigt.

Es ist auch wichtig zu beachten, dassthe exception translation mechanism uses proxies - damit Spring Proxys um die DAO-Klassen erstellen kann, dürfen diese nicht alsfinal deklariert werden.

3. Der DAO

Zunächst implementieren wir die Basisschicht für alle DAOs - eine abstrakte Klasse, die Generika verwendet und erweitert werden soll:

public abstract class AbstractJpaDAO< T extends Serializable > {

   private Class< T > clazz;

   @PersistenceContext
   EntityManager entityManager;

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

   public T findOne( long id ){
      return entityManager.find( clazz, id );
   }
   public List< T > findAll(){
      return entityManager.createQuery( "from " + clazz.getName() )
       .getResultList();
   }

   public void create( T entity ){
      entityManager.persist( entity );
   }

   public T update( T entity ){
      return entityManager.merge( entity );
   }

   public void delete( T entity ){
      entityManager.remove( entity );
   }
   public void deleteById( long entityId ){
      T entity = findOne( entityId );
      delete( entity );
   }
}

Der wichtigste interessante Aspekt hierbei ist der Wegthe EntityManager is injected - unter Verwendung der Standardanmerkung@PersistenceContext. Unter der Haube wird dies vonPersistenceAnnotationBeanPostProcessor erledigt - das die Annotation verarbeitet, den JPA-Entitätsmanager aus den Contains abruft und einfügt.

Der Persistenz-Postprozessor wird entweder explizit durch Definieren in der Konfiguration oder automatisch durch Definieren voncontext:annotation-config odercontext:component-scan in der Namespace-Konfiguration erstellt.

Beachten Sie außerdem, dass die EntitätClass im Konstruktor übergeben wird, um in den generischen Operationen verwendet zu werden:

@Repository
public class FooDAO extends AbstractJPADAO< Foo > implements IFooDAO{

   public FooDAO(){
      setClazz(Foo.class );
   }
}

4. Fazit

In diesem Tutorial wurdenhow to set up a DAO layer with Spring and JPA anhand der XML- und Java-basierten Konfiguration veranschaulicht. Wir haben auch besprochen, warum manJpaTemplatenicht verwendet und wie man es durchEntityManagerersetzt. 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 - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.