Das DAO mit JPA und Spring

1. Übersicht

Dieser Artikel zeigt, wie das DAO mit Spring und JPA implementiert wird . Informationen zur JPA-Kernkonfiguration finden Sie im Artikel über JPA mit Spring.

2. Keine Frühlingsvorlagen mehr

Beginnend mit Frühling - 3.1, die JpaTemplate und der entsprechende JpaDaoSupport wurden zugunsten der Verwendung der nativen Java Persistence API veralten.

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

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

Infolgedessen ist es jetzt empfehlenswert, die Java-Persistenz-API direkt anstelle der JpaTemplate zu verwenden .

2.1. Ausnahmeübersetzung ohne Vorlage

Eine der Aufgaben von JpaTemplate war die Übersetzung von Ausnahmen - die Übersetzung der Ausnahmen auf niedriger Ebene in die allgemeinen Spring-Ausnahmen auf höherer Ebene.

Ohne die Vorlage ist die Ausnahmeübersetzung weiterhin aktiviert und für alle mit @Repository kommentierten DAOs voll funktionsfähig . Spring implementiert dies mit einem Bean-Postprozessor, der alle @ Repository- Beans mit dem gesamten PersistenceExceptionTranslator im Container anzeigt .

Es ist auch wichtig zu beachten, dass der Ausnahmeübersetzungsmechanismus Proxys verwendet. Damit Spring Proxys um die DAO-Klassen erstellen kann, dürfen diese nicht als endgültig deklariert werden .

3. Das DAO

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

public abstract class AbstractJpaDAO { private Class clazz; @PersistenceContext EntityManager entityManager; public final void setClazz( Class clazzToSet ){ this.clazz = clazzToSet; } public T findOne( long id ){ return entityManager.find( clazz, id ); } public List 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 die Art und Weise, wie der EntityManager injiziert wird - unter Verwendung der standardmäßigen @ PersistenceContext- Annotation. Unter der Haube wird dies vom PersistenceAnnotationBeanPostProcessor erledigt, der 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 von Kontext: Annotation-Konfiguration oder Kontext: Komponentenscan in der Namespace-Konfiguration erstellt.

Beachten Sie auch, dass die Einheit der Klasse wird in dem Konstruktor übergeben , um in den generischen Operationen verwendet werden:

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

4. Fazit

In diesem Tutorial wurde veranschaulicht, wie eine DAO-Ebene mit Spring und JPA unter Verwendung von XML- und Java-basierter Konfiguration eingerichtet wird. Wir haben auch besprochen, warum Sie das JpaTemplate nicht verwenden und wie Sie es durch den EntityManager ersetzen können . 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 - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.