La maitrise de la persistance des données est essentielle au bon fonctionnement d'un système d'information.
Il y'a différentes manière de persister les données: JDBC, DAO ou par les outils évolués d'ORM, Spring facilitant l'implémentation de chacune d'elle.
La partie persistance de Spring a deux avantages:
- L'avantage de faciliter l'accès aux données grâce à des templates qui «masquent» les problématiques d'ouverture et de fermeture des connexions quelque soit le type de DataSource utilisé (connexion autonome DBCP ou JNDI).
- L'avantage de s'interfacer avec des outils puissants semi ORM tels que Ibatis ou 100% ORM comme Hibernate.
Spring et la persistance des données plus détail :
1. Support JDBC de Spring
O Classe centrale JdbcTemplate (totalement threadsafe, peut être utilisé par plusieurs threads en même temps) et ses variantes :
O NamedParameterJdbcTemplate avec utilisation d’un RowMapper pour transformer le résultat de la requête en objet.
O SimpleJdbcTemplate : exploite les Generics et les méthodes à arguments variables.
2. Il existe un Support par les trois classes précédentes, par exemple pour SimpleJdbcTemplate il s’agit de la classe SimpleJdbcDaoSupport, un dao doit hériter de cette classe.
3. Support ORM de Spring
O Le standard JPA
¨Création d’un EntityManagerFactory :
1. Utilisation d’un LocalEntityMangerFactoryBean (principe de démarage par défaut de JPA) pour environement de test ou prototypage.
2. Récupération d’un EntityManagerFactory par appel JNDI avec la balise <jee :jdndi-lookup../>.
3. Utilisation d’un LocalContainerEntityManagerFactoryBean. Spring agit alors comme un Serveur d’application et définit compètement l’EntityManagerFactoryBean.
a. Avantages / Inconvénients :
i. Avantage : solution portable
ii. Inconvénient : solution autonome, pas de partage de l’EntityManagerfactory avec d’autres applications.
b. Injection d’une DataSource
c. Branchement d’une implémentation JPA par l’attribut JpaVendorAdapter :
i. EclipseLink
ii. Hibernate (HibernateJpaVendorAdapter): Implémentation utilisée par le serveur d’application JBoss.
iii. OpenJPA
iv. TopLink
¨Implémentation 100% JPA avec l’annotation.
1. @PersistenceContext qui indique au conteneur (Spring ou EJB 3.0) d’injecter un EntityManager au DAO (lui-même créé par un EntityManagerFactoryBean). Activation de l’annotation @PersistenceContext par configuration xml avec le BeanPostProcessor PersistenceAnnotationBeanPostProcessor qui permet à Spring d’utiliser, de manière transparente, un proxy pour la création d’un EntityManager pour chaque thread.
2. L’annotation @Repositoty de Spring permet à des DAO 100% JPA de lever des DataAccessExceptions. Activation avec un PersistenceExceptionTranslationPostProcessor.
3. Une classe de template Spring pour JPA : JpaTemplate et une classe de support DAO : JpaDaoSupport.
4. Les solutions non standardisées :
O Ibatis
¨Les deux problèmes d’Ibatis gérés par Spring:
1. Une gestion programmatique du context de persistance très contraignante.
2. Une politique des d’exceptions trop génériques.
¨Création, par configuration xml, d’un bean sqlMapCient à partir d’un SQLMapClientFactoryBean avec les paramètre suivant :
1. Une dateSource
2. Un fichier de configuration sqlmap-config.xml
a. Ce fichier fait référence à un fichier xml de définition des requêtes SQL et de mapping Objet des résultats des requêtes : exemple Property.xml
¨Configuration d’un template Spring SqlMapClientTemplate à partir du sqlMapClient configuré. Ce template encapsule toute les exceptions SQL dans des DataAccessExceptions (exceptions d’accès aux donnée de Spring).
¨Utilisation du support DAO : SqlMapClientDaoSuport.
O Hibernate
¨Création d’une SessionFactory :
1. par configuration xml avec la classe LocalSessionFactoryBean
2. Par annotation par création d’un sessionFactory de type AnnotationSessionFactoryBean. Les annotations JPA ou les annotations Hibernate : @Entity, @Table, @Column, @id, etc...
¨Utilisation de la classe HibernateTemplate (threadsafe) qui encapsule toute les exceptions Hibernate en DataAccessException Spring.
¨Utilisation du support DAO : HibernateDaoSupport.