Types d applications pour la persistance Université de Nice Sophia-Antipolis Version 0.9 28/8/07 Richard Grin Toutes les applications n ont pas une complexité qui nécessite une architecture n- tiers Ce cours décrit les grands modèles d applications qui utilisent une base de données relationnelle Richard Grin Types d application pour la persistance page 2 Base de données préexistante? 2 points importants pour processus de développement de l application : n La base de données qui sera utilisée existe-telle déjà ou non? n S la base préexiste, le développeur de l application peut-il modifier, au moins partiellement, la structure de la base? Richard Grin Types d application pour la persistance page 3 Outils de développement Des outils permettent de générer des classes Java à partir du schéma d une base ou inversement de générer le schéma d une base à partir des classes Java des objets persistants Si la base préexiste et ne peut être modifiée, le mapping objet-relationnel devra tenir compte à la fois de la conception objet et du schéma de la base Sinon, le schéma de la base pourra être généré automatiquement à partir des classes Java Richard Grin Types d application pour la persistance page 4 3 modèles Toutes les applications n ont pas une complexité qui nécessite une architecture n-tiers 3 modèles schématiques d architecture : n Modèle «procédural» n Modèle objet simple avec persistance intégrée aux objets n Modèle objet avec utilisation d un outil de mapping Variantes avec passerelles Chacun de ces modèles peut utiliser ou non des «passerelles» entre l objet et le relationnel, classes supplémentaires qui isolent le code qui gère la persistance (DAO par exemple) Richard Grin Types d application pour la persistance page 5 Richard Grin Types d application pour la persistance page 6 1
Autour des procédures Modèle «procédural» Pour les applications aux fonctionnalités les plus simples et pour un développement rapide Le plus souvent la base de données est préexistante L application est organisée autour de procédures qui accèdent directement à la base de données quand c est nécessaire Utilisation possible de procédures stockées pour encapsuler les scénarios des cas d utilisation Richard Grin Types d application pour la persistance page 7 Richard Grin Types d application pour la persistance page 8 Exemple : classe GestionEmployes Méthode void ajouter(int matricule, String nom, ) ajoute un nouvel employé, en ajoutant une nouvelle ligne dans la base Méthode double gettotaldept(int dept) renvoie le total des salaires pour un département, en lançant une requête SQL qui ramène le résultat On peut se passer d une classe Employe Pour des modèles métier simples Les traitements de l application doivent être pauvres en traitements métier et essentiellement liés à la persistance des données : n ajouts et suppressions d enregistrements n modifications simples de données effectuées directement par l utilisateur Richard Grin Types d application pour la persistance page 9 Richard Grin Types d application pour la persistance page 10 Ce modèle est limité On est dans ce cas très éloigné du modèle objet ; on ne profite donc pas de ses atouts : n héritage n polymorphisme n facilité de réutilisation des objets n relations entre objets n Quand l application se complexifie il est difficile de l enrichir avec de nouvelles fonctionnalités et de réutiliser/partager du code Richard Grin Types d application pour la persistance page 11 Modèle objet simple avec persistance intégrée aux objets Richard Grin Types d application pour la persistance page 12 2
Un modèle objet simple La correspondance entre les tables et les classes est le plus souvent bijective Chaque classe contient le code pour gérer la persistance de ses propres instances Pattern appelé «active record» par Martin Fowler Exemple : classe Employe La table EMPLOYE lui est associé Elle contient la méthode d instance ajouter() (on pourrait l appeler ajoutetoidanslabase) qui ajoute une ligne dans la table EMPLOYE ; cette ligne contient les valeurs des attributs de l instance La classe contient aussi des méthodes sauvegarder() (ou modifier()), supprimer() Richard Grin Types d application pour la persistance page 13 Richard Grin Types d application pour la persistance page 14 Méthodes pour la recherche Elles peuvent être mises : n dans une classe qui se charge des recherches (un finder) n en static dans la classe métier qui correspond au type renvoyé n dans le cas particulier où le critère de recherche correspond à une des classes métier, la méthode peut être mise dans cette classe métier (choix 3 du transparent suivant) Exemple Une méthode qui recherche tous les employés d un département Choix 1 : List<Employe> rechercher(dept dept) dans la classe RechercheEmploye Choix 2 : static List<Employe> rechercher(dept dept) de la classe Employe Choix 3 : List<Employe> getemployes() de la classe Departement Richard Grin Types d application pour la persistance page 15 Richard Grin Types d application pour la persistance page 16 Désavantages Les classes métier sont trop liées au support de persistance utilisé En conséquence tout refactoring entraînant une modification du modèle objet va obliger à revoir le code de la persistance Le code pour la persistance se révèle vite long, fastidieux et difficile à écrire et à mettre au point dès que le modèle objet se complexifie et qu on recherche des bonnes performances dans un environnement chargé Utilisation d un outil de mapping Richard Grin Types d application pour la persistance page 17 Richard Grin Types d application pour la persistance page 18 3
Un modèle objet complexe avec outil de mapping Pour les modèles objets complexes avec beaucoup d héritage et d associations entre classes le modèle précédent est difficile à implémenter et à maintenir Un outil de mapping ou un framework permet d automatiser la correspondance objetrelationnel Outils de mapping La correspondance objet-relationnel est décrite dans des fichiers des configuration ou par des annotations La persistance peut devenir presque transparente pour le développeur qui écrit le code Java Difficile d écrire soi-même de tels outils car ils sont très complexes Richard Grin Types d application pour la persistance page 19 Richard Grin Types d application pour la persistance page 20 JPA Spécification standard pour la persistance de objets Java (étudié à la fin de ce cours) Fait partie de la spécification EJB 3, framework pour les applications d entreprise TopLink Essentials est l implémentation de référence de JPA Hibernate Avec Toplink, l outil de mapping le plus utilisé dans le monde Java Utilise un gestionnaire de persistance, l introspection et l enrichissement de code à l exécution pour récupérer les valeurs des propriétés des objets et gérer leur persistance Les dernières versions sont conformes au standard JPA Richard Grin Types d application pour la persistance page 21 Richard Grin Types d application pour la persistance page 22 Autres possibilités JDO (Java Data Objects) est une autre API qui offre des possibilités semblables à JPA Utilise l enrichissement de code pendant la phase de compilation Framework (cadre de développement) Ensemble de classes et ressources préexistantes que le développeur doit compléter Utilisation d une librairie : l exécution est dirigée par le code écrit par le développeur, qui fait appel aux classes de la librairie Utilisation d un framework : l exécution est dirigée par le framework qui fait appel au code écrit par le développeur Richard Grin Types d application pour la persistance page 23 Richard Grin Types d application pour la persistance page 24 4
EJB Le framework standard pour les applications Java d entreprise, EJB (Entreprise Java Beans), est fourni par J2EE, la version «d entreprise» de Java Il nécessite l utilisation d un serveur d applications qui est un logiciel lourd À réserver pour les grosses applications d entreprises Richard Grin Types d application pour la persistance page 25 EJB Classes Java qui implémentent les fonctionnalités d une application Le développeur écrit le code lié aux fonctionnalités du métier, sans s occuper des services techniques (sécurité, distribution sur plusieurs machines, transactions, persistance, ) Le serveur d applications utilise ce code et y ajoute tous les services techniques indispensables au bon fonctionnement de l application Richard Grin Types d application pour la persistance page 26 EJB Entités version 2 Il existe plusieurs types d EJB Les EJB entités correspondent aux objets métier persistants Leur persistance peut être entièrement prise en charge par le container d EJB fourni par le serveur d application Problèmes EJB entités version 2 Les classes persistantes doivent hériter de certaines classes fournies par le framework Elles ne peuvent donc hériter d autres classes Le framework ne peut prendre en charge la persistance d objets des classes Java ordinaires (POJO : Plain Old Java Object) Il est aussi difficile, sinon impossible, d utiliser les classes persistantes en dehors du container, en particulier pour les tests Richard Grin Types d application pour la persistance page 27 Richard Grin Types d application pour la persistance page 28 EJB version 3 Les EJB entités n existe plus en tant que tels dans EJB 3 Une entité est une classe Java ordinaire POJO dont la persistance est prise en charge par JPA (étudié dans la suite du cours) Les entités n ont plus à hériter de classes spéciales et peuvent être testés en dehors du serveur d applications Avantages des serveurs d applications pour les EJB L avantage d utiliser les serveurs d applications qui supportent les EJB est que la prise en charge est complète (sécurité, transaction, distribution, accès concurrents, ) Il est plus facile de maintenir le code lorsque l application monte en charge (plus grand nombre de connexions, distribution des serveurs sur plusieurs machines, ) Richard Grin Types d application pour la persistance page 29 Richard Grin Types d application pour la persistance page 30 5
Passerelle Passerelles Classe qui contient tout le code pour gérer la persistance Chaque table a une classe «passerelle» qui lui correspond Le reste de l application fait appel aux passerelles pour gérer la persistance Richard Grin Types d application pour la persistance page 31 Richard Grin Types d application pour la persistance page 32 Utilisation Isolent la persistance du reste de l application Facilitent les changements de SGBD et permettent d alléger le code des classes métier Peuvent être utilisées avec les 3 modèles vus précédemment 2 types de passerelle Une instance de passerelle par table (le plus fréquent) Une instance de passerelle par ligne de table Le pattern DAO (Data Access Object), très utilisé et étudié plus loin dans ce cours, correspond au type «une passerelle par table» Richard Grin Types d application pour la persistance page 33 Richard Grin Types d application pour la persistance page 34 Exemple de passerelle La classe EmployeDAO gère la persistance des instances de la classe Employe et correspond à la table employe Elle contient la méthode ajouter(int matricule, String nom, ) La méthode prend en paramètre les informations sur l employé à ajouter car il existe une seule instance de la classe EmployeDAO pour tous les employés Exemple de passerelle Avec une instance de passerelle par ligne, on aurait une méthode ajouter() car la passerelle aurait toutes les informations sur l employé auquel elle est liée Richard Grin Types d application pour la persistance page 35 Richard Grin Types d application pour la persistance page 36 6
Bibliographie Patterns of Entreprise Application Architecture de Martin Fowler Addison Wesley Richard Grin Types d application pour la persistance page 37 7