Vous êtes sur la page 1sur 11

Java Persistence API

Patrons de conception

Introduction

JPA offre pour le langage JAVA une interface de programmation standardise vers les bases de donnes relationnelles

Pour les composants lourds EJB au sein d'un serveur d'application JAVA EE Pour les objets POJO dans un environnement JAVA SE avec ou sans cadriciel (Spring)

Mais JPA ne propose pas de modle d'utilisation

Catalogue de solutions (1)

Patrons de conception de base


Data Access Object (DAO) Sauvegarde d'entits dtaches Recherche d'entits Suppression d'entits Service de Faade et Data Transfer Object (DTO)

Catalogue de solutions (2)

Patrons de conception avancs


Associations bi-directionnelles Chargement lazy UUID (Universal Unique Identifier) comme solution pour les cls primaires Accs aux champs et accs aux proprits Correspondance des hirarchies d'hritage Tests

JPA et DAO

Intrts

Offre une couche d'abstraction lgre au-dessus de JPA Unifie en les masquant les mthodes du grant de persistance (EntityManager) Permet de masquer certaines mthodes du grant de persistance (remove) Offre un seul point d'entre pour la persistance Permet de centraliser en un seul endroit les requtes et les paramtres

Modle DAO avec JPA

Exemple de DAO gnrique (1)


Interface gnrique :
public interface Dao<K, E> { void persist(E entity); void remove(E entity); E findById(K id); }

K reprsente le type de la clef et E celui de l'entit persistante

Exemple de DAO gnrique (2)


Classe abstraite gnrique :
public abstract class JpaDao<K, E> implements Dao<K, E> { protected Class<E> entityClass; @PersistenceContext protected EntityManager entityManager; public JpaDao() { ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1]; } public void persist(E entity) { entityManager.persist(entity); } public void remove(E entity) { entityManager.remove(entity); } public E findById(K id) { return entityManager.find(entityClass, id); } }

Exemple de DAO spcifique


Interface spcifique :
public interface EtudiantDao extends Dao<Integer, Etudiant> { List<Etudiant> findEtudiantRegistredSince(Date date); List<Etudiant> findAll(); }

Classe spcifique :
public class JpaEtudiantDao extends JpaDao<Integer, Etudiant> implements EtudiantDao { public List<Etudiant> findEtudiantRegistredSince(Date date) { Query q = entityManager.createQuery( "SELECT e FROM " + entityClass.getName() + " e WHERE date >= :date_since"); q.setParameter("date_since", date); return (List<Etudiant>) q.getResultList(); } public List<Etudiant> findAll() { ... }

Client DAO

EtudiantDao etudiantdao = new JpaEtudiantDao(); Etudiant etudiant = new Etudiant(); etudiant.setNumero(1515); etudiant.setName(''Marignan''); ... etudiantdao.persist(etudiant); ....

Avantages du DAO avec JPA

Pas de dpendance direct sur l'API JPA pour les clients du DAO Types scuriss par l'utilisation des generics

Si transformation de type (cast) celle-ci est ralise par l'implmentation du DAO pas par le client

Un seul emplacement logique pour regrouper tout le code JPA spcifique aux entits Un seul emplacement pour dlimiter les transactions