De DAO met JPA en Spring

1. Overzicht

Dit artikel laat zien hoe implementeer de DAO met Spring en JPA. Zie het artikel over JPA met Spring voor de kern-JPA-configuratie.

2. Geen lentesjablonen meer

Beginnend met Spring 3.1, de JpaTemplate en de daarbij behorende JpadredSupportben geweest vervallen ten gunste van het gebruik van de native Java Persistence API.

Beide klassen zijn ook alleen relevant voor JPA 1 (van het JpaTemplate Javadoc):

Merk op dat deze klasse niet is geüpgraded naar JPA 2.0 en dat ook nooit zal gebeuren.

Als gevolg hiervan is het nu de beste praktijk om gebruik de Java Persistence API rechtstreeks in plaats van de JpaTemplate.

2.1. Uitzonderingsvertaling zonder de sjabloon

Een van de verantwoordelijkheden van JpaTemplate was uitzondering vertaling - het vertalen van de lage uitzonderingen naar de hogere, generieke voorjaarsuitzonderingen.

Zonder de sjabloon, uitzonderingsvertaling is nog steeds ingeschakeld en volledig functioneel voor alle DAO's die zijn geannoteerd met @Repository. Spring implementeert dit met een bonen-postprocessor die iedereen zal adviseren @Repository bonen met alle PersistenceExceptionTranslator gevonden in de container.

Het is ook belangrijk om dat op te merken het vertaalmechanisme voor uitzonderingen maakt gebruik van proxy's - opdat Spring proxy's rond de DAO-klassen kan maken, mogen deze niet worden gedeclareerd laatste.

3. De DAO

Eerst zullen we de basislaag implementeren voor alle DAO's - een abstracte klasse die generieke geneesmiddelen gebruikt en ontworpen is om te worden uitgebreid:

openbare abstracte klasse AbstractJpaDAO {privé Class clazz; @PersistenceContext EntityManager entityManager; openbare laatste leegte setClazz (Klasse clazzToSet) {this.clazz = clazzToSet; } openbare T findOne (lange id) {return entityManager.find (clazz, id); } openbare lijst findAll () {return entityManager.createQuery ("van" + clazz.getName ()) .getResultList (); } public void create (T entity) {entityManager.persist (entiteit); } openbare T-update (T-entiteit) {return entityManager.merge (entiteit); } public void delete (T entity) {entityManager.remove (entiteit); } openbare ongeldige deleteById (lange entiteitId) {T entiteit = findOne (entiteitId); verwijderen (entiteit); }}

Het belangrijkste interessante aspect hier is de weg de EntityManager wordt geïnjecteerd - gebruikmakend van de standaard @PersistenceContext annotatie. Onder de motorkap wordt dit afgehandeld door de PersistenceAnnotationBeanPostProcessor - die de annotatie verwerkt, de JPA-entiteitsbeheerder ophaalt uit de bevat en deze injecteert.

De persistentie-postprocessor wordt ofwel expliciet gemaakt door deze in de configuratie te definiëren of automatisch, door te definiëren context: annotation-config of context: component-scan in de naamruimte config.

Merk ook op dat de entiteit Klasse wordt doorgegeven in de constructor om te worden gebruikt in de generieke bewerkingen:

@Repository openbare klasse FooDAO breidt uit AbstractJPADAO implementeert IFooDAO {openbare FooDAO () {setClazz (Foo.class); }}

4. Conclusie

Deze tutorial geïllustreerd hoe u een DAO-laag opzet met Spring en JPA, waarbij zowel op XML als op Java gebaseerde configuratie wordt gebruikt. We hebben ook besproken waarom we de JpaTemplate en hoe u deze vervangt door de EntityManager. Het uiteindelijke resultaat is een lichtgewicht, schone DAO-implementatie, met bijna geen afhankelijkheid van Spring tijdens compileren.

De implementatie van dit eenvoudige project is te vinden in het GitHub-project - dit is een op Maven gebaseerd project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.