Transcript
Page 1: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

La couche persistance

Page 2: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Le plan

• Introduction rappel architecture Java EE

• La couche de persistance

• Accès JDBC vers Base de Données

• Hibernate

Page 3: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Introduction: Principes J2EE

Page 4: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Le problème et la solution

Page 5: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Architecture en couche

Page 6: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 7: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

UML d’un DAOc la s s DAO

IDA O

« i n te rfa ce ,d a o »

IC rudD 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 c tH ib 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

+ f i n a l i ze () : vo i d

+ sa u ve g a rd e r(ID a ta ) : vo id

+ S i m p l e Cru d H i 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 tri n g« u se »

Page 8: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Accès aux bases de données

Page 9: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 10: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

JDBC - La marche à suivre• Etablir une connexion

Page 11: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

JDBC – La marche à suivre• Obtenir un Statement et exploitation des résultats

Page 12: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Les outils ORM

Page 13: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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)

Page 14: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 15: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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é

Page 16: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 17: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 18: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 19: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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)

Page 20: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Exemple de fichier de mapping

Page 21: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 22: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 23: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Les états des objets

• Les actions en base sont reportées au niveau des objets mappés• Sauvegarde

• Lecture

• Mise à jour

Page 24: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Exemple d’utilisation

Page 25: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

L’objet Java persistant

class Persistance

Ev ent

- date: Date

- id: Long

- ti tle: String

+ Event()

+ getDate() : Date

+ getId() : Long

+ getT itle() : String

+ setDate(Date) : void

- setId(Long) : void

+ setT itle(String) : void

Page 26: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Correspondance Objet-Relationnel

Page 27: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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é

Page 28: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Fonctions de persistance : CRUD

• Create (Insertion)

• Read (Lecture)

• Update (Modification)

• Delete (Suppression)

Page 29: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 30: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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());

Page 31: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 32: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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)

Page 33: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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 !

Page 34: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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)

Page 35: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 36: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Fonctions de lecture (Criteria)

• Palette d’expressions très large :

Page 37: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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

Page 38: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

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[]

Page 39: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1

Fonctions de lecture

• Laquelle choisir ?

» Privilégier la qualité du logiciel :

id/asso criteria HQL SQL

» Lisibilité

» Performance

» Encapsulation

Page 40: La couche persistance hibernate

MD

-3-0

1-S

M-1

0 ré

v. B1


Top Related