Mapping Objet-Relationnel Hibernatealain.berro.free.fr/cours/igsi/Hibernate.pdf · Le...
-
Upload
vuongthuan -
Category
Documents
-
view
218 -
download
0
Transcript of Mapping Objet-Relationnel Hibernatealain.berro.free.fr/cours/igsi/Hibernate.pdf · Le...
Mapping Objet-Relationnel
-
Hibernate
http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/
https://netbeans.org/kb/docs/web/hibernate-webapp.html
https://netbeans.org/kb/docs/java/hibernate-java-se.html
1
Le développement d’application web
Mise en œuvre de la persistance de données
La persistance est une technique en charge de
l’enregistrement et de la restauration des données
Le pattern DAO (Data Access Object)
Effectue le lien entre la couche métier (les objets) et la couche de
données (les tables)
Une classe - Une table
Un objet - Un tuple
Une propriété - Un attribut
Type SQL - Type Java
Implémente les opérations CRUD
Create, Read, Update et Delete
2
Le développement d’application web
Mise en œuvre de la persistance de données
Problématiques
Comment traduire et gérer les références entre objets ?
Les relations en BD sont bidirectionnelles
Les références entre objets sont unidirectionnelles
Comment différencier un objet persistant ou pas ?
L’utilisateur doit pouvoir manipuler un objet et le rendre persistant que si
nécessaire
Comment gérer un cache d’objets ?
Un objet (représentant un tuple) doit être unique
Vous êtes capables de programmer tout cela !
4
Le développement d’application web
Hibernate
Hibernate est un framework de mapping Objet-Relationnel
Très utilisé actuellement
Permet de manipuler les données d’une BD comme des objets donc de
s’éloigner des requêtes SQL
Gère les caches d’objets
Gère les transactions
…
La correspondance est décrite dans un fichier de mapping
5
Le développement d’application web
Les classes persistances dans Hibernate
Pour être rendues persistantes une classe doit être un POJO
(Plain Ordinary Java Object).
Tous les attributs doivent posséder leur setter et getter
Implémenter le constructeur par défaut
Désigner une propriété comme identifiant (optionnel)
Implémenter equals() et hashCode()
Les collections
Set : interface pour un ensemble d’objets. Les doublons ne sont pas
autorisés. Pas d'accès direct aux éléments.
List : interface pour un ensemble ordonné d’objets. Doublons autorisés
et accès direct à un élément.
Map : interface qui gère un ensemble sous la forme clé/valeur.
6
Le développement d’application web
États d’un objet
7
Transient
Persistant
Détaché
Détruit
Ramasse-miette
Ramasse-miette
new
load
get
evict update
saveOrUpdate
save
saveOrUpdate
delete
Le développement d’application web
États d’un objet
Transient (Éphémère)
Un objet est éphémère s'il a juste été instancié en utilisant l'opérateur
new.
Il n'a aucune représentation persistante dans la base de données et
aucune valeur d'identifiant n'a été assignée.
Les instances éphémères seront détruites par le ramasse-miettes si
l'application ne conserve aucune référence.
Utiliser la session d'Hibernate pour rendre un objet persistant.
8
Le développement d’application web
États d’un objet
Persistant
Une instance persistante a une représentation dans la base de données
et une valeur d'identifiant. Elle peut avoir été sauvegardée ou chargée.
Elle est dans la portée d’une session.
Hibernate détectera tout changement effectué sur un objet dans l'état
persistant et synchronisera l'état avec la base de données lors de la fin
de l'unité de travail.
9
Le développement d’application web
États d’un objet
Détaché
Une instance détachée est un objet qui a été persistant, mais dont la
session a été fermée. La référence à l'objet est encore valide et l’objet
peut être modifié.
Une instance détachée peut être rattachée à une nouvelle session
ultérieurement, la rendant (et toutes les modifications avec) de nouveau
persistante.
Cette fonctionnalité rend possible un modèle de programmation pour de
longues unités de travail qui requièrent un temps de réflexion de
l'utilisateur (conversation).
10
Le développement d’application web
Exemple
Rendre un objet persistant Session ses = HibernateUtil.getSessionFactory().getCurrentSession();
Employe e = new Employe("Dupond", "Pierre");
Transaction tc = ses.beginTransaction() ;
ses.save(e);
tc.commit(); // Commit et flush automatique de la session
e.setNomE("Dupont");
Session ses2 = HibernateUtil.getSessionFactory().getCurrentSession();
ses2.beginTransaction() ;
ses2.update(e);
ses2.getTransaction().commit();
11
Le développement d’application web
Les requêtes
En HQL (Hibernate Query Language)
Langage d’interrogation orientée objet
Query q = session.createQuery("from Demande as dde where
dde.nbJours between 2 and 4)
List<Demande> ld = (List<Demande>) q.list();
En SQL natif List l = session.createSQLQuery("Select *
From Demande").list();
Retourne une liste d’Object[]
13
Le développement d’application web
Les requêtes
Hibernate Query Named
Les requêtes HQL les plus utilisées peuvent êtres déclarées dans le
fichier de mapping XML
<query name="GET_ALL_EMPLOYE">from Employe</query>
Pour l’exécuter : session.getNamedQuery(”GET_ALL_EMPLOYE”)
L’API Criteria
Permet de définir les critères d’une requête d’un manière objet (par
appel de méthode) au lieu d’utiliser le HQL
List l_nb_dde = session.createCriteria(Employe.class)
.add(Restrictions.like("nomE", "%er%"))
.setProjection(Projections.projectionList()
.add(Projections.property("nomE"))
.add(Projections.property("prenomE")))
.list(); 14
Le développement d’application web
Association de type 1-n entre classes
Association de type 1-n (one-to-many) ou n-1 (many-to-one)
Association « Effectuer »
Pour traduire l’association, nous devons ajouter :
Une référence dans la classe coté many : « Demande » et
<many-to-one> dans le fichier de mapping
Une collection dans la classe coté one : « Employe » et
<one-to-many> dans le fichier de mapping
15
Le développement d’application web
Fichier de mapping pour une association 1-n
De la classe Employe à la table Employe
<hibernate-mapping>
<class catalog="berro" name="metier.Employe" table="Employe">
<id name="codeE" type="java.lang.Integer">
<column name="CodeE"/>
<generator class="identity"/>
</id>
<property name="nomE" type="string">
<column length="25" name="NomE" not-null="true"/>
</property>
<property name="prenomE" type="string">
<column length="25" name="PrenomE" not-null="true"/>
</property>
…
</class>
</hibernate-mapping> 16
Le développement d’application web
Fichier de mapping pour une association 1-n
Propriété Set<Demande> demandes de la classe Employe
<hibernate-mapping>
<class catalog="berro" name="metier.Employe" table="Employe">
…
<set cascade="all" inverse="true" name="demandes">
<!-- Clé étrangère de Demande vers Employe -->
<key column="CodeEmp"/>
<one-to-many class="metier.Demande"/>
</set>
…
</class>
</hibernate-mapping>
17
Le développement d’application web
Fichier de mapping pour une association 1-n
Propriétés Employe employe de la classe Demande
<hibernate-mapping>
<class catalog="berro" name="metier.Demande" table="Demande">
…
<many-to-one name="employe"
class="metier.Employe"
not-null="true"
column="CodeEmp"
insert="false"
update="false"/>
…
</class>
</hibernate-mapping>
18
Le développement d’application web
Association de type n-n entre classes
Association de type n-n (many-to-many)
Association « Travailler »
Ne pas créer le POJO et le fichier de mapping pour « Travailler »
Pour traduire l’association, nous devons ajouter :
Une collection dans la classe « Service »
<many-to-many> dans le fichier de mapping vers la classe « Employe »
Une collection dans la classe « Employe »
<many-to-many> dans le fichier de mapping vers la classe « Service »
19
Le développement d’application web
Fichier de mapping pour une association n-n
Propriété Set<Employe> employes de la classe Service
<hibernate-mapping>
<class catalog="berro" name="metier.Service" table="Service">
…
<set name="employes" inverse="true" table="Travailler">
<!-- Clé étrangère de Travailler vers Service -->
<key column="CodeServ"/>
<!-- Clé étrangère de Travailler vers Employe -->
<many-to-many column="CodeEmp" class="metier.Employe"/>
</set>
…
</class>
</hibernate-mapping>
20
Le développement d’application web
Fichier de mapping pour une association n-n
Propriété Set<Service> services de la classe Employe
<hibernate-mapping>
<class catalog="berro" name="metier.Employe" table="Employe">
…
<set name="services" table="Travailler">
<!-- Clé étrangère de Travailler vers Employe -->
<key column="CodeEmp"/>
<!-- Clé étrangère de Travailler vers Service -->
<many-to-many column="CodeServ" class="metier.Service"/>
</set>
…
</class>
</hibernate-mapping>
21
Le développement d’application web
Classe d’association
Classe d’association « Valider »
La classe d’association se traduit comme 2 associations 1-n :
Une association entre Service et Valider
Propriété Map<Demande, Valider> validers dans la classe Service
Propriété Service service dans la classe Valider
Une association entre Demande et Valider
Propriété Map<Service, Valider> validers dans la classe Demande
Propriété Demande demande dans la classe Valider
22
Le développement d’application web
Fichier de mapping
Propriété Map<Demande, Valider> validation
dans la classe Service
<hibernate-mapping>
<class name="metier.Service" table="Service" catalog="ensg_berro"
…
<map name="validers" table="Valider" cascade="all" inverse="false" lazy="true" fetch="select">
<!-- Clé étrangère de Valider vers Service -->
<key>
<column name="CodeServ" not-null="true" />
</key>
<map-key-many-to-many column="CodeDde" class="metier.Demande" />
<one-to-many class="metier.Valider" />
</map>
…
</class>
</hibernate-mapping> 23