La couche persistance hibernate
Upcoming SlideShare
Loading in...5
×
 

La couche persistance hibernate

on

  • 177 views

Hibernate est une solution open source de type ORM (Object Relational Mapping) qui permet de faciliter le développement de la couche persistance d'une application. Hibernate permet donc de ...

Hibernate est une solution open source de type ORM (Object Relational Mapping) qui permet de faciliter le développement de la couche persistance d'une application. Hibernate permet donc de représenter une base de données en objets Java et vice versa.

Statistics

Views

Total Views
177
Views on SlideShare
175
Embed Views
2

Actions

Likes
0
Downloads
2
Comments
0

1 Embed 2

http://www.slideee.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

La couche persistance hibernate La couche persistance hibernate Presentation Transcript

  • MD-3-01-SM-10rév.B1 La couche persistance
  • MD-3-01-SM-10rév.B1 Le plan • Introduction rappel architecture Java EE • La couche de persistance • Accès JDBC vers Base de Données • Hibernate
  • MD-3-01-SM-10rév.B1 Introduction: Principes J2EE
  • MD-3-01-SM-10rév.B1 Le problème et la solution
  • MD-3-01-SM-10rév.B1 Architecture en couche
  • MD-3-01-SM-10rév.B1 Le schéma de conception DAO • DAO = Data Access Object • Résout la problématique d’isolation entre les couches Business et Persistance • Permet d’exposer sous forme de service les accès vers les données • Améliore la mise en œuvre des tests
  • MD-3-01-SM-10rév.B1 UML d’un DAO c la s s DAO IDA O « i n te rfa ce ,d a o » ICrudD AO + a j o u te r(IDa ta ) : vo id + ch a rg e r(IDa ta ) : IDa ta + sa u ve g a rd e r(IDa ta ) : vo id + su p p ri m e r(IDa ta ) : vo id A b stra ctHib e rn a te DA O « d a o » hibe rna te :: Ba s ic CrudHibe rna te D AO + a j o u te r(IDa ta ) : vo id + ch a rg e r(IDa ta ) : IDa ta + fin a l ize () : vo i d + sa u ve g a rd e r(ID a ta ) : vo id + S i m p l e Cru d Hi b e rn a te DA O () + su p p ri m e r(IDa ta ) : vo id « d a o » Ba s ic CrudJ dbc DAO + a jo u te r(IDa ta ) : vo i d + ch a rg e r(ID a ta ) : ID a ta + sa u ve g a rd e r(IDa ta ) : vo i d + su p p rim e r(IDa ta ) : vo i d « i n te rfa ce » v a lue obje c t::IDa ta + to S tri n g () : S trin g « u se »
  • MD-3-01-SM-10rév.B1 Accès aux bases de données
  • MD-3-01-SM-10rév.B1 Implémentation de type JDBC • Accès via un driver à la base de données • Drivers JDBC (4 types de drivers) • La marche à suivre pour l’implémentation • Charger le driver correspondant au SGDB • Obtenir une Connection • Obtenir un Statement encapsulant une phrase SQL • Obtenir un ResultSet encapsulant le résultat de la phrase SQL • Exploiter le ResultSet
  • MD-3-01-SM-10rév.B1 JDBC - La marche à suivre • Etablir une connexion
  • MD-3-01-SM-10rév.B1 JDBC – La marche à suivre • Obtenir un Statement et exploitation des résultats
  • MD-3-01-SM-10rév.B1 Les outils ORM
  • MD-3-01-SM-10rév.B1 Autre solution • Une autre solution pour faire correspondre des objets avec une base relationnelle sont les outils ORM (Object Relational Mapping) • Qu’apporte un outil ORM • Automatise ou facilite la correspondance entre des données stockées dans des objets et une base de données relationnelle • Le plus souvent les données sont décrites dans des fichiers de configuration (souvent XML) • Les principaux produits : TopLink d’Oracle(commercial) et Hibernate (open source)
  • MD-3-01-SM-10rév.B1 Les outils ORM • Fonctionnalités de base • Recherche et enregistre les données associées à un objet dans une base de données • Détecte quand un objet a été modifié et l’enregistre en optimisant les accès à la base • Avantages • Évite l’écriture de code répétitif, inintéressant et source d’erreurs difficiles à déceler • Gain de 30 à 40 % du nombre de lignes de certains projets • Améliore la portabilité du code pour des changements de SGBD
  • MD-3-01-SM-10rév.B1 Les outils ORM • Avantages • Le développeur pense en termes d’objet et pas en termes de lignes de tables • Sans outil ORM le développeur peut hésiter à concevoir un modèle objet « fin » afin d’éviter du codage complexe pour la persistance • Le refactoring du schéma de la base de données ou du modèle objet est facilité
  • MD-3-01-SM-10rév.B1 Les travers • Ce type d’outil n’est pas adapté dans le cas de manipulation importante de lignes pour chaque update • La manipulation d’un grand nombre d’objets nuit aux performances
  • MD-3-01-SM-10rév.B1 Les classes de persistantes dans Hibernate • Ce sont de simple objet java (POJO : Plain Old Java Objects) • Pas d’implémentation d’interface ou d’héritage spécifique • Contraintes obligatoires
  • MD-3-01-SM-10rév.B1 Contraintes • Contraintes obligatoires pour les classes persistantes • Elles doivent avoir un constructeur sans paramètre (il peut être privé, mais il est préférable qu’il soit accessible par le paquetage) • Les collections qui représentent des associations doivent être typées avec des interfaces et non des classes ; par exemple Set et pas HashSet • Contraintes optionnelles mais recommandées • Un des champs doit identifier une instance parmi toutes les autres de la même classe • Tous les champs qui sont persistants doivent avoir un modificateur (setter) et un accesseur (getter) ; ils peuvent être privés
  • MD-3-01-SM-10rév.B1 Fichier de Mapping • Décrit comment se fera la persistance des objets d’une classe • Format XML ; grammaire imposée • Se place dans le même répertoire que la classe et se nomme Classe.hbm.xml si la classe s’appelle Classe (facultatif)
  • MD-3-01-SM-10rév.B1 Exemple de fichier de mapping
  • MD-3-01-SM-10rév.B1 Attribut du tag property • column indique le nom de la colonne dans la table relationnelle • Par défaut, elle a le même nom que la propriété (attribut « name ») • type indique le type « Hibernate » de la propriété ; Hibernate en déduit le type SQL et le type Java • Par défaut, il est déterminé par introspection de la classe
  • MD-3-01-SM-10rév.B1 Identificateur • Le tag id est obligatoire pour chaque classe qui est représentée par une table (une classe « composant » n’est pas représentée par une table) • Il indique quelle sera la clé primaire de la table • Remarque : les sous-classes héritent des identificateurs de leur classe mère
  • MD-3-01-SM-10rév.B1 Les états des objets • Les actions en base sont reportées au niveau des objets mappés • Sauvegarde • Lecture • Mise à jour
  • MD-3-01-SM-10rév.B1 Exemple d’utilisation
  • MD-3-01-SM-10rév.B1 L’objet Java persistant class Persistance Ev ent - date: Date - id: Long - title: String + Event() + getDate() : Date + getId() : Long + getTitle() : String + setDate(Date) : void - setId(Long) : void + setTitle(String) : void
  • MD-3-01-SM-10rév.B1 Correspondance Objet-Relationnel
  • MD-3-01-SM-10rév.B1 Etats d’une entité (objet mappé sur la BDD) L’instance d’une entité possède 3 états possibles : • Transient / Ephémère : • Non associé à un contexte de persistance • Pas d'identifiant de persistance (valeur de clé primaire) • Persistant : • Associé au contexte de persistance • Possède un identifiant (ou associé à un objet qui possède un id.) • Détaché : • Précédemment associé au contexte de persistance • Contexte de persistance fermé
  • MD-3-01-SM-10rév.B1 Fonctions de persistance : CRUD • Create (Insertion) • Read (Lecture) • Update (Modification) • Delete (Suppression)
  • MD-3-01-SM-10rév.B1 Fonctions de création • Création d’une nouvelle entité Person aPerson = new Person(); session.save(aPerson); • Création par association à une entité persistante Person aPerson = (Person) session.load(Person.class, personId); Event anEvent = new Event(); aPerson.addEvent(anEvent); • Une session doit être ouverte • L’identifiant du nouvel objet est affecté par Hibernate • Attention aux contraintes de champ obligatoire • Sauvegarde par « grappe » d’entités
  • MD-3-01-SM-10rév.B1 Fonctions de modification • Modification d’une entité persistante Person aPerson = (Person) session.load(Person.class, personId); aPerson.setPrenom("autre Prenom"); • Modification d’une entité détachée aPerson.setPrenom("autre Prenom"); // en dehors de la session session.update(aPerson); // rattachement de l’entité • Modification via une association Person aPerson = (Person) session.load(Person.class, personId); Event anEvent = aPerson.getFirstEvent(); anEvent.setDate(new Date());
  • MD-3-01-SM-10rév.B1 Fonctions de suppression • Suppression d’une entité persistante Person aPerson = (Person) session.load(Person.class, personId); session.delete(aPerson); • Suppression via une association Person aPerson = (Person) session.load(Person.class, personId); Event anEvent = aPerson.getEvents().removeFirst(); • Destruction des entités orphelines
  • MD-3-01-SM-10rév.B1 Fonctions de lecture • Possibilités multiples : • Recherche par l’identifiant • Recherche par une association • Recherche HQL (Hibernate Query Language) • Recherche SQL • Recherche par critère (QBC) • Recherche par l’exemple (QBE)
  • MD-3-01-SM-10rév.B1 Fonctions de lecture (simple) • Chargement d’une entité par l’identifiant Person aPerson = (Person) session.load(Person.class, personId); Person aPerson = new Person(); session.load(aPerson, personId); • Chargement d’une entité via une association Person aPerson = (Person) session.load(Person.class, personId); Set<Event> events = aPerson.getEvents(); • Multiplication du nombre d’accès base de données !
  • MD-3-01-SM-10rév.B1 Fonctions de lecture (HQL) • Chargement explicite entité + association Person aPerson = (Person) session.createQuery( "select p from Person p left join fetch p.events where p.id = :pid") .setParameter("pid", personId) .uniqueResult(); • Utilisation du modèle métier (entités) • Chargement avec critères (clause where) • Un seul accès base de données (mot clé fetch)
  • MD-3-01-SM-10rév.B1 Fonctions de lecture (Criteria) • Recherche multi-critères sur une entité Criteria crit = session.createCriteria(Person.class); crit.add( Expression.eq( "nom", "PIGNON" ) ); crit.add( Expression.like( "prenom", "R%" ) ); List<Person> persons = crit.list(); • Combiner les expressions • Comparaisons unitaires • Comparaisons sur des fonctions de groupes • Opérations logiques entre expressions
  • MD-3-01-SM-10rév.B1 Fonctions de lecture (Criteria) • Palette d’expressions très large :
  • MD-3-01-SM-10rév.B1 Fonctions de lecture (Query By Example) • Recherche par l’exemple sur une entité Person exemple = new Person(); Exemple.setNom("PIGNON"); Exemple.setPrenom("R%"); List<Person> persons = session.createCriteria(Person.class) .add( Example.create(exemple).enableLike() ) .list(); • Simplicité d’utilisation
  • MD-3-01-SM-10rév.B1 Fonctions de lecture (SQL natif) • Recherche en SQL natif sur une entité String requete = "SELECT count(*) FROM TCSFDOSSIERCONTROLESURFACE dossier " + "WHERE exists (SELECT 1 " + "FROM TCSFSELECTIONDOSSIERCTRL selection, " + "TCSFCONTROLE controle, TREFMESUREACONTROLER mes, " + "WHERE dossier.CODEDDAF = :codeDdaf ..."; SQLQuery sqlquery = session.createSQLQuery(requete); sqlquery.setParameter("codeDdaf", codeDdaf); BigDecimal result = (BigDecimal) sqlquery.uniqueResult(); • Chargement optimisé vs base de données • Nécessite une projection - sinon retourne un Object[]
  • MD-3-01-SM-10rév.B1 Fonctions de lecture • Laquelle choisir ? » Privilégier la qualité du logiciel : id/asso criteria HQL SQL » Lisibilité » Performance » Encapsulation
  • MD-3-01-SM-10rév.B1