Vous êtes sur la page 1sur 10

06/04/2020

Mapping Objet Relationnel


Avec Hibernate

Objectifs d’Hibernate

• Que permet de faire Hibernate ?


• Hibernate s’occupe du transfert des classes Java dans les tables de la
base de données (et des types de données Java dans les types de
données SQL)
• Quel avantage est apporté par Hibernate ?
• Il réduit de manière significative le temps de développement qui
aurait été autrement perdu dans une manipulation manuelle des
données via SQL et JDBC.

1
06/04/2020

Architecture du noyau Hibernate

• Fichier de configuration
• Version XML :
• hibernate.cfg.xml permettant un
paramétrage plus fin
• Configuration par programmation

Architecture du noyau Hibernate

2
06/04/2020

Architecture du noyau Hibernate

• SessionFactory (org.hibernate.SessionFactory) :
• Cache immuable (threadsafe) des correspondances (mappings) vers une (et une
seule) base de données
• Coûteuse à construire car implique l’analyse des fichiers de Configuration
• Construite à partir d’un objet Configuration
• Session (org.hibernate.Session) :
• Objet mono-threadé, à durée de vie courte, représentant une conversation entre
l'application et l'entrepôt de persistance
• Encapsule une connexion JDBC
• Contient un cache des objets persistants

Architecture du noyau Hibernate

3
06/04/2020

Environnement Hibernate

• Bibliothèques Hibernate Core (en plus de hibernate3.jar) :


• antlr.jar
• ANTLR (Another Tool for Language Recognition) - Indispensable à l’exécution
• commons-collections.jar
• Bibliothèques du projet Apache Jakarta Commons pour manipuler les
collections - Indispensable à l’exécution
• Jta.jar
• API JTA strandard – requis pour les applications s’exécutant en dehors d’un
serveur d’application
• dom4j.jar
• Analyseur Syntaxique de configuration XML et de mapping - Indispensable à
l’exécution
• log4j jar
• log4j.Mécanisme de log sous-jacent pouvant être utilisé par Commons Logging -
Optionnel

Configuration d’Hibernate

• Déclaration du type de document utilisé par l’analyseur syntaxique


(parseur) XML pour valider le document de configuration d’après la
DTD de configuration d’Hibernate :
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD
3.0//EN " "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
• Paramètres de configuration nécessaires pour la connexion JDBC :
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/orm
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</property>

4
06/04/2020

Environnement Hibernate

• Fichiers nécessaires avec Hibernate Core :


• hibernate.cfg.xml : fichier de configuration globale contenant
• Les paramètres de connexion à la base de données (pilote, login, mot de passe,
url, etc.)
• Le dialecte SQL de la base de données
• La gestion de pool de connexions
• Le niveau de détails des traces etc.
• Pour chaque classe persistante :
• ClassePersistante.java : Implémentation POJO (Plain Old Java Objects) de la
classe
• ClassePersistante.hbm.xml : Fichier XML de correspondance (mapping)
• ClassePersistanteHome.java : Implémentation du DAO (Data Access Object)
pour l’isolation avec la couche de persistance – Optionnel

Classes persistantes

• Objets persistants implémentés sous la forme de POJO


• Pas d’implémentation de certaines interfaces d’héritage de classes
particulières
• Des règles à respecter :
• Implémenter un constructeur sans paramètre (pouvant être privé mais
de préférence accessible par le paquetage)
• Fournir une propriété d'identifiant (optionnel mais fortement
recommandé)
• Implémenter des modificateurs (mutateurs - setter) et accesseurs(getter)
pour chaque champ persistant

10

10

5
06/04/2020

Manipuler les objets persistantes

SessionFactory sf= new Configuration().configure().buildSessionFactory();


sf.openSession();
Transaction tx = null;
Session session=sf.getCurrentSession();
try {tx = session.beginTransaction();
Employer c1 = new Employer(“Sabeur", “Elkosantini",100f);
session.save(c1);
session.flush();
tx.commit();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
sf.close();}}
11

11

Diagramme d’états des objets d’une classe persistante

* Méthodes JPA - implémentées dans Hibernate EntityManager mais pas dans


Hibernate Core
12

12

6
06/04/2020

Correspondance des associations

• Partie la plus complexe dont dépend les performances de l’application


• Balises de correspondance des collections : <set>, <list>; <map>, <bag>,
<array> …
• Tags de correspondance des cardinalités/multiplicités : <one-to-one>,
<many-to-one>, <one-to-many>, <many-to-many>
• Associations uni ou bi directionnelles

13

13

Requête HQL

• "Langage de requêtes orientées objet" ou encapsulation du SQL


selon une logique orientée objet
• Requêtes HQL (et SQL natives) représentées avec une instance
de org.hibernate.Query
• Obtention d’une Query en utilisant la Session courante :
session.createQuery (string)
• Clauses : from, select, where
• Invocation de la méthode list() ⇒ retour du résultat sous forme
de liste
Query req = session.createQuery("from Module");
List modules=req.list();

14

14

7
06/04/2020

Requête HQL

• Interface Query fournit deux méthodes pour récupérer un sous


ensemble du résultat. Très utile pour la pagination.
Query req = session.createQuery("from Module");
req.setFirstResult(20);// premier enregistrement(commence
par 0)
req.setMaxResults(10);// nombre d’enregistrement
List modules=req.list();
• Avec HQL on peut ajouter des paramètres à la requête
Query req = session.createQuery("from Module where id=?");
Req.setInt(0,100);
List modules=req.list();

15

15

Requête HQL

• Autre méthode
Query req = session.createQuery("from Module where
id=:id_m");
Req.setInt(id_m,100);
List modules=req.list();
• from :
• Clause suivie d’un nom de classe et non de la relation de BD :
from Module
• Utilisation des alias
Query req = session.createQuery("from Module as m where
m.id=:id_m");

16

16

8
06/04/2020

Requête HQL

• join :
• Pour exécuter des jointures (inner join)
Select e from Enseignant e join e.department Departement
where Department.nom = “Etude”
• Where:
• Equivalent à celle de SQL, on peut utiliser and, or et not
from Enseignant e where e.nom like ‘%M%’ and e.salaires
between 100 and 200;
• Utilisation de null
from Enseignant e where e.department is not null

17

17

Requête SQL native

• Pour utiliser des requêtes optimisées et tirer partie des


spécificités du SGBD utilisé
• Requêtes natives du noyau
session.createSQLQuery("SELECT * FROM PERSON").list();
• Retourne une liste d’Object[] avec des valeurs scalaires pour
chaque colonne de la table PERSON (i.e. retourne une table
comme pour les requêtes classiques JDBC)
session.createSQLQuery("SELECT * FROM PERSON")
.addEntity(Person.class);
• Retourne une liste d’objets de la classe Person

18

18

9
06/04/2020

Exercice

• Application de gestion de personnels d’une société:


✓Page d’ajout d’un nouveau département (id, nom)
✓Page d’ajout d’un nouveau personnel (id, nom, prénom, âge)
✓Page de recherche d’un personnel par son id (un formulaire ayant un
seul champ)
✓Page avec un formulaire ayant un seul champs (âge) qui permet de
recherche de tous les personnels ayant un âge supérieur à la valeur
saisit
✓UNE SEULE servlet Traitement

Pour développer cette application, utiliser les tags JSTL et Hibernate

19

19

10