mapping objet-relationnel hibernatealain.berro.free.fr/cours/igsi/hibernate.pdf · le...

23
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

Upload: vuongthuan

Post on 10-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

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

Exemple de travail

3

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

Exemple de travail

12

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