Base de données avancées
Chapitre 4 : ORM avec Hibernate
Dr Konan Marcellin BROU
[email protected]
2O20-2021
Sommaire
Introduction
Concepts de base d’Hibernate
Utiliser Hibernate
Mise en œuvre avec Eclipse
Bibliographie
INP-HB/K. M. BROU BD avancées : Hibernate 2
I. Introduction
Objectif
◼ Comprendre les concepts du
mapping objet-relationnel
◼ Comprendre l’ORM Hibernate
◼ Savoir créer une application ORM
avec Hibernate
INP-HB/K. M. BROU BD avancées : Hibernate 3
I. Introduction
1.1. Mapping Objet-SGBDR ? Couche d'accès aux données
▪ Couche plus basse d'une
◼ ORM : Object Relational Mapping architecture applicative
But : établir une correspondance ▪ Permet d'interfacer le code métier
entre : avec une source de données.
▪ une table de la BD relationnelle ; ▪ L'intérêt est de pouvoir changer
▪ et une classe du modèle objet. de base de données en n'ayant
besoin de ne modifier que la
Paradigme relationnel Paradigme objet couche d'accès.
Wrapper Client Persistance
BDR SGBDR objet ▪ Un objet (instance d'une classe)
est persistant si l'état des
attributs de cet objet est conservé
Wrapper client Orienté Objet dans les lignes de table d'une
(Wrapping Objet) BD.
Un objet Java est persistant,
Langage de Programmation
c'est-à-dire a sa place dans une
Orienté Objet + SGBDR table d'une BD, s'il est instance
d'une classe Java mappée.
INP-HB/K. M. BROU BD avancées : Hibernate 4
I. Introduction
◼ Mapping ◼ On stocke l'état d'un objet dans
Le mapping d'une classe permet, une BD.
entre autre, de savoir comment la ◼ Exemple : classe Client
table correspondante devra être possède 3 attributs numCl, nom et
implantée dans le SGBD associé. adresse
◼ Opérations CRUD : on associe cette classe à une table
qui possède 3 colonnes : numCl,
Create (INSERT) ; nom et adresse.
Read (SELECT) ;
Update (UPDATE) ;
Client
Delete (DELETE). numCl API de BD
Nom (JDBC, SQLJ)
adresse
Table Client
INP-HB/K. M. BROU BD avancées : Hibernate 5
I. Introduction
Forces :
Classe Client ▪ Utilisation de systèmes existants
numCl:Integer
▪ Développement rapide
Nom:String
Adresse;String d'application OO exploitant les
Instance
données (business objects)
numCl:1 numCl nom adresse Faiblesses :
Nom:Toto 1 Toto Yakro
2 Froto Yakro ▪ Cohabitation de deux paradigmes:
Adresse;Yakro
3 Mankou Abidjan ▪ Serveur de BDR (Schéma
Table Client Relationnel)
BD relationnelle ▪ Client : C++ ou Java (Schéma
objet)
▪ Pas d'intégration au SGBDR
◼ Décomposition de chaque objet en ▪ Pas de maintien de l'intégrité
une suite de variables.
▪ Procédures stockées
◼ La valeur de ces variables sont
stockées dans une ou plusieurs Solution limitée
tables. Vendeurs : Ardent, Persistence
Software, Ontologic, …
INP-HB/K. M. BROU BD avancées : Hibernate 6
I. Introduction
◼ Framework ORM Java
Hibernate
Enterprise JavaBeans Entity
Beans
Java Data Objects
Castor
TopLink
Spring DAO
INP-HB/K. M. BROU BD avancées : Hibernate 7
I. Introduction
1.2. Pourquoi ORM ? Classe Java Client
◼ Différence entre le modèle public class Client {
private int numCl;
d'objet et la BD relationnelle private String nom;
SGBDR représenter des données public int getNumCl() {
dans un format tabulaire return numCl;
}
LOO tels que Java ou C# public void setNumCl(int numCli) {
représentent les données comme this.numCl = numCli;
un graphe d'objets }
interconnectés. public String getNom() {
return nom;
◼ Exemple : }
Table User public void setNom(String nomCli) {
this.nom = nomCli;
CREATE TABLE Client }
(numCl INT NOT NULL, public String getTel() {
nom VARCHAR(20), return tel;
tel VARCHAR(10), }
PRIMARY KEY(numCl) public void setTel(String te) {
) ENGINE=InnoDB ; this.tel = te;
}
INP-HB/K. M. BROU BD avancées : Hibernate } 8
I. Introduction
Incompatibilité Description
◼ Problèmes
Granularité Parfois, on peut avoir un modèle
Problème 1 : Modifier la structure objet qui a plus de classes que
de la BD après avoir développé le nombre de tables
l’application entraine la correspondantes dans la BD.
modification de l’application. Héritage Pas de d’héritage dans les
Problème 2 : stocker des objets SGBDR, paradigme naturel dans
dans une BD relationnelle soulève les LOO.
les cinq problèmes suivants. Identité Un SGBDR définit exactement la
notion de clé primaire. Les LOO
définissent à la fois objet
identité (a == b) et objet
l'égalité (a.equals (b)).
Associations LOO représentent des
associations en utilisant des
références d'objets, les SGBDR
utilisent une clé étrangère.
Navigation Les façons dont on accède à des
objets en LOO et dans un
SGBDR sont fondamentalement
INP-HB/K. M. BROU BD avancées : Hibernate différents 9
I. Introduction
◼ Avantages de JDBC ◼ Avantages de ORM
Permet aux applications métiers Une API pour effectuer des
l'accès aux objets plutôt que opérations de base CRUD sur des
l'accès aux tables de la BD. objets persistants des classes.
Masque les détails de requêtes Un langage ou une API pour
SQL de la logique de LOO. spécifier des requêtes qui font
Basé sur JDBC référence à des classes et des
Pas besoin de connaître la mise propriétés de classes.
en œuvre des BD. Une facilité pour spécifier le
entités basées sur des concepts mapping des métadonnées.
métiers plutôt que la structure de Des techniques pour optimiser les
BD. transactions.
Gestion des transactions et la
génération automatique de clés.
Le développement rapide
d'application.
INP-HB/K. M. BROU BD avancées : Hibernate 10
I. Introduction
1.4. ORM Hibernate ▪ Utilisation des POJOs (Plain Old
◼ Présentation Java Objects), Java beans.
Le framework ORM d’accès aux ▪ Configuration au travers de
données le plus populaire pour fichiers XML ou d’annotations.
J2EE. Libérer le développeur de 95%
Framework de mapping objet- des tâches de programmation
relationnel ou de persistance liées à la persistance de données
objet des données. commune.
Permet de réaliser la persistance
des données c'est à dire de
transcrire des classes Java dans Objet Java
des tables de BD, et des types de
données Java dans les types de ORM
Hibernate SGBDR
données SQL.
▪ Requêtes pour CRUD (HQL
Hibernate Query Language).
INP-HB/K. M. BROU BD avancées : Hibernate 11
I. Introduction
◼ Avantages Hibernate ne nécessite pas un
Hibernate s’occupe du mapping serveur d'applications pour
des classes Java et des tables de fonctionner.
la BD à l'aide de fichiers XML, Manipule les associations
sans écrire une ligne de code. complexes d'objets d’une BD.
Fournit des API simples pour Permet de créer une couche
stocker et récupérer des objets d’accès aux données (DAO) plus
Java directement depuis et vers la modulaire, plus maintenable, plus
BD. performante qu’une couche
S’il y a un changement dans la BD d’accès aux données classique
ou dans n’importe quelle table, il reposant sur l’API JDBC.
faut seulement modifier les
propriétés du fichiers XML.
Epargne des types SQL inconnus
et permet de travailler avec des
objets Java familiers.
INP-HB/K. M. BROU BD avancées : Hibernate 12
I. Introduction
◼ SGBD supportés ◼ Télechargement
HSQL Database Engine https://sourceforge.net/projects
/hibernate/
DB2/NT
https://sourceforge.net/projects
MySQL : utilisé dans ce cours /hibernate/files/hibernate-
PostgreSQL orm/5.4.31.Final/hibernate-
FrontBase release-5.4.31.Final.zip/download
Oracle ◼ Autre framework ORM Java
Microsoft SQL Server Database Enterprise JavaBeans Entity
Beans
Sybase SQL Server
Java Data Objects
Informix Dynamic Server
Castor
TopLink
Spring DAO
INP-HB/K. M. BROU BD avancées : Hibernate 13
II. Concepts de base d’Hibernate
2.1. Architecture d’Hibernate
INP-HB/K. M. BROU BD avancées : Hibernate 14
II. Concepts de base d’Hibernate
◼ Explication
La couche applicative voit les
données comme des classes dont
le contenu reste en mémoire
même après la fin d'exécution du
programme. D'où persistance
objet des données.
le lien entre les classes exposées
et la source physique des données
(souvent une base de données
relationnelle) est définie par un
fichier xml. D'où mapping objet-
relationnel.
INP-HB/K. M. BROU BD avancées : Hibernate 15
II. Concepts de base d’Hibernate
2.2. Mapping Hibernate Exemple :
◼ Fichier Mapping ▪ Client.hbm.xml
nomClasse.hbm.xml ▪ Doit être placé dans le package
contenant le fichier de classe
Permet de faire le lien entre les
java: wkp/Client.hbm.xml
champs de la table et ceux de la
classe.
Placer le fichier de mapping dans
le même répertoire que le fichier
de classe.
Par convention l’extension est
.hbm.xml.
On définit un fichier par classe /
table.
INP-HB/K. M. BROU BD avancées : Hibernate 16
II. Concepts de base d’Hibernate
2.3. Déclaration
◼ Modèle de déclaration
Client.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="wkp">
<class name="Client" table="Client">
<id name="id" column="numCl">
<generator class="increment"/>
</id>
<property name="nom" type="string" column="nom"/>
<property name="tel" type="string" column="tel"/>
</class>
</hibernate-mapping>
INP-HB/K. M. BROU BD avancées : Hibernate 17
II. Concepts de base d’Hibernate
◼ Structure du mapping Explication
<hibernate-mapping package="PackageName">
Paramètre Explication
<class
name="ClassName" PackageName nom du package ou se trouve la classe
table="tableName"
ClassName nom de la classe Java
lazy="true|false"
polymorphism="implicit|explicit" tableName nom de la table de la BD
where="arbitrary sql where condition" autres paramètres à définir selon la BD et
rowid="rowid" l’environnement
subselect="SQL expression"
...
>
...
</hibernate-mapping>
INP-HB/K. M. BROU BD avancées : Hibernate 18
II. Concepts de base d’Hibernate
2.4. Définition des champs de
la table
champ Explication
id permet de définir l’identifiant de la table
property champ simple
composite-id clé composée
timestamp champ de type date/heure
INP-HB/K. M. BROU BD avancées : Hibernate 19
II. Concepts de base d’Hibernate
2.5. Structure d’un identifiant ◼ Définition de l’identifiant
<id
champ Explication
name="propertyName" name nom du champ de la classe
type="typename"
column="column name" type integer, long, float, string, character,
unsaved-value="null|any|none|undefined|id value" timestamp,binary, ...
access="field|property|ClassName"> column nom du champ dans la table
node="element-name|@attribute-name|element/@attribute|."
generator méthode de génération de
<generator class="generatorClass"/> l’identifiant :
</id> assigned : l’utilisateur est
responsable de la génération
native : la BD est responsable de la
génération
INP-HB/K. M. BROU BD avancées : Hibernate 20
II. Concepts de base d’Hibernate
2.6. Structure d’une propriété ◼ Définition d’une propriété
<property champ Explication
name="propertyName"
name, type, column Nom, type et colonne
column="column name"
type="typename" update, insert indique que le champ doit
update="true|false"
être ajouté lors
insert="true|false"
formula="arbitrary SQL expression" d’une modification ou
access="field|property|ClassName" insertion (défaut à vrai)
lazy="true|false" formula expression SQL qui permet
unique="true|false"
de définir le champ
not-null="true|false"
index="index name" lazy : accès aux objets associés
unique key="unique key id"
length="L"
precision="P"
scale="S"
/>
INP-HB/K. M. BROU BD avancées : Hibernate 21
II. Concepts de base d’Hibernate
2.7. Stratégies de chargement ◼ 4 Stratégies de fetching
◼ Fetching Immediate
Concerne le chargement des Lazy : ne charge pas tout
objets liés par des relations Eager : on spécifie quels objets
Problème complexe pour assurer doivent être chargés
l’efficacité Batch : chargement par lot
Exemple : chargement d’un client
▪ La table client est reliée à la table
commande par une relation 1:n.
▪ Faut-il charger toutes les
commandes lors du chargement
du client ?
INP-HB/K. M. BROU BD avancées : Hibernate 22
III. Utiliser Hibernate
3.1. Présentation ◼ Architecture d'Hibernate
◼ Hibernate a besoin de plusieurs
éléments pour fonctionner :
une classe de type javabean qui
encapsule les données d'une
occurrence d'une table
un fichier de configuration qui
assure la correspondance entre la
classe et la table (mapping)
des propriétés de configuration
notamment des informations
concernant la connexion à la base
de données
INP-HB/K. M. BROU BD avancées : Hibernate 23
III. Utiliser Hibernate
◼ Téléchargement Hibernate ◼ Téléchargement connecteur
http://hibernate.org/ MySQL
https://sourceforge.net/projects https://downloads.mysql.com/ar
/hibernate/files/hibernate- chives/c-j/
orm/5.4.31.Final/hibernate- Version utilisée :
release-5.4.31.Final.zip/download mysql-connector-java-5.1.48.jar
Version utilisée :
hibernate-release-5.4.31.Final
INP-HB/K. M. BROU BD avancées : Hibernate 24
III. Utiliser Hibernate
3.2. Fichier de configuration
◼ hibernate.cfg.xml
Définit les paramètres d’accès à la
BD
Définit où trouver les fichiers de
mapping (ressource)
Doit être placé dans le répertoire
src du projet
INP-HB/K. M. BROU BD avancées : Hibernate 25
III. Utiliser Hibernate
Exemple :
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3308/contactdb</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="dialect">org.hibernate.dialect.MySQLDialect </property>
<property name="show_sql">true</property>
<mapping resource="com/mycompany/Contact.hbm.xml"/>
</session-factory>
</hibernate-configuration>
INP-HB/K. M. BROU BD avancées : Hibernate 26
III. Utiliser Hibernate
Explication
Attribut Explication
hibernate.connection.url: URL de connexion à la BD
jdbc:mysql://localhost/bdgsf (MySQL)
jdbc:postgresql://localhost/bdgsf(Psotgresql)
jdbc:oracle:thin:@localhost:1521:bdoracle
hibernate.connection.username: Nom de l’utilisateur de la BD.
hibernate.connection.password: Mot de passe de la BD
hibernate.connection.pool_size: Taille du pool de connexion de la BD. Ce nombre de
connexions sera vérifié par l'application au moment de la
création de session factory.
hibernate.connection.driver_class: Classe du pilote de BD
com.mysql.jdbc.Driver (MySQL)
org.postgresql.Driver (Postgresql)
oracle.jdbc.driver.OracleDriver (Oracle)
hibernate.dialect: Dialect à utiliser par Hibernate pour faire la conversion de
syntaxe pour les requêtes de BD.
org.hibernate.dialect.MySQLDialect (MySQL)
org.hibernate.dialect.PostgreSQLDialect (Postgresql)
org.hibernate.dialect.OracleDialect,
org.hibernate.dialect.Oracle10gDialect (Oracle)
INP-HB/K. M. BROU BD avancées : Hibernate 27
III. Utiliser Hibernate
Attribut Explication
current_session_context_class: contexte dans lequel la session en cours doivent être
maintenus, par exemple thread
h. transaction.factory_class: transaction factory
show_sql: Permet d’afficher la requête SQL, très bon pour le
débogage.
Dans l'environnement de production, il doit être
réglé faux
cartographie resource = "com / Cartographie des fichiers hbm.
hibernatetest / demo /
User.hbm.xml":
INP-HB/K. M. BROU BD avancées : Hibernate 28
III. Utiliser Hibernate
3.3. SessionFactory public static void main(String[] args) {
ServiceRegistry registry;
◼ Obtenir une instance de SessionFactory sessionFactory;
SessionFactory registry = new
StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
◼ Réalise l’initialisation de la // Create the MetadataSources
connexion MetadataSources sources = new MetadataSources(registry);
// Create the Metadata
Metadata metadata = sources.getMetadataBuilder().build();
// Create SessionFactory
package wkp; sessionFactory = metadata.getSessionFactoryBuilder().build();
import java.io.Serializable; // opens a new session from the session factory
Session session = sessionFactory.openSession();
import org.hibernate.Session; session.beginTransaction();
import org.hibernate.SessionFactory; …
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
INP-HB/K. M. BROU BD avancées : Hibernate 29
III. Utiliser Hibernate
◼ Les méthodes de la classe
Session
Method Return Description Code SQL
beginTransaction() Transaction Crée une Transaction
getTransaction() Transaction Returns the current
transaction.
get(Class class, Serializable Object Charge une instance SELECT
id) persistante de la classe donnée
avec l'ID, dans la session.
load(Class class, Serializable Object idem méthode get (), mais SELECT
id) renvoie une erreur
ObjectNotFound si aucune
ligne avec l'ID donné n'existe
pas.
persist(Object) void Enregistre un objet mappé INSERT
sous forme de ligne dans la
BD.
save(Object) Serializable Idem méthode persist(), et INSERT
renvoie l’identifiant généré.
INP-HB/K. M. BROU BD avancées : Hibernate 30
III. Utiliser Hibernate
Method Return Description Code SQL
update(Object) void Met à jour une instance UPDATE
détachée de l'objet donné
et la ligne sous-jacente
dans BD.
saveOrUpdate(Object) void Enregistre l'objet donné s'il INSERT UPDATE
n'existe pas, sinon le met
à jour.
delete(Object) void Supprime un objet DELETE
persistant et la ligne sous-
jacente dans la BD.
close() void Ferme la session courante.
flush() void Vide la session en cours.
Cette méthode doit être
appelée avant de valider la
transaction et de fermer la
session.
disconnect() void Déconnecte la session de
la connexion JDBC
actuelle.
INP-HB/K. M. BROU BD avancées : Hibernate 31
III. Utiliser Hibernate
3.4. Librairies .jar
◼ Mettre dans le répertoire dans le
classpath :
L’ensemble des fichiers de
Hibernate lib/required
Ajouter le connecteur
mysql-connector-java-5.1.48.jar
INP-HB/K. M. BROU BD avancées : Hibernate 32
III. Utiliser Hibernate
3.5. Création des POJOs Créer la table Client avec MySQL
◼ POJO : Plain Old Java Objects
CREATE database hibernate;
◼ Pour la persistance des données use hibernate;
à la BD, Hibernate nécessite un
CREATE TABLE Client
objet Java bean (POJO). (numCl INT NOT NULL,
l'objet POJO a les méthode setter nom VARCHAR(20),
tel VARCHAR(10),
et getter des attributs de la table PRIMARY KEY(numCl)
de la BD. ) ENGINE=InnoDB ;
Comme ces objets POJO voyagent
à travers le réseau, ces objets
doivent implémenter l'interface
Serializable.
INP-HB/K. M. BROU BD avancées : Hibernate 33
III. Utiliser Hibernate
Créer la classe Client.java
package wkp; public void setId(int id) {
this.id = id;
public class Client { }
private int id; public String getNom() {
private String nom; return nom;
private String tel; }
public void setNom(String nom) {
public Client() { this.nom = nom;
} }
public Client(int id, String nom, String tel) { public String getTel() {
this.id = id; return tel;
this.nom = nom; }
this.tel = tel; public void setTel(String tel) {
} this.tel = tel;
public Client(String nom, String tel) { }
this.nom = nom; void afficher() {
this.tel = tel; System.out.println("Client(" + id + "," + nom + ","
} + tel + ")");
public int getId() { }
return id; }
}
INP-HB/K. M. BROU BD avancées : Hibernate 34
III. Utiliser Hibernate
3.6. Création des DAO ServiceRegistry registry;
◼ Un seul DAO (données d'objets SessionFactory sessionFactory;
registry = new
Access) est impliqué. StandardServiceRegistryBuilder().configure("hibernate.cfg.xml")
◼ Cette classe de Dao dispose de .build();
méthodes pour effectuer toutes // Créer les MetadataSources
les opérations CRUD de base : MetadataSources sources = new MetadataSources(registry);
Create : CREATE // Créer les Metadata
Read : SELECT Metadata metadata = sources.getMetadataBuilder().build();
Update : UPDATE // Créer SessionFactory
sessionFactory = metadata.getSessionFactoryBuilder().build();
Delete : DELETE
// ouvrir une nouvelle session à partir de session factory
Session session = sessionFactory.openSession();
session.beginTransaction();
INP-HB/K. M. BROU BD avancées : Hibernate 35
IV. Mise en œuvre avec Eclipse
4.1. Présentation
◼ Version : Eclipse jee 2019-09
INP-HB/K. M. BROU BD avancées : Hibernate 36
IV. Mise en œuvre avec Eclipse
4.2. Créer un nouveau projet
◼ Créer un nouveau projet Java
Nom : Hibernate
INP-HB/K. M. BROU BD avancées : Hibernate 37
IV. Mise en œuvre avec Eclipse
INP-HB/K. M. BROU BD avancées : Hibernate 38
IV. Mise en œuvre avec Eclipse
4.3. Modifier le Classpath
◼ Ajouter les fichier jar de
Hibernate au Classpath
hibernate-release-5.4.31.Final
\lib\required
INP-HB/K. M. BROU BD avancées : Hibernate 39
IV. Mise en œuvre avec Eclipse
Clic droit sur le projet/Build
path/Configure Build Path
Clic sur Add JARs
Parcourir le système de fichier
Sélectionner tous les fichiers du
Clic sur l’onglet Library dossier hibernate-release-
Clic sur Classpath 5.4.31.Final \lib\required
Clic sur "Apply and Close"
INP-HB/K. M. BROU BD avancées : Hibernate 40
IV. Mise en œuvre avec Eclipse
Dérouler le dossier "Referenced
Library" pour visualiser ces
fichiers
INP-HB/K. M. BROU BD avancées : Hibernate 41
IV. Mise en œuvre avec Eclipse
◼ Ajouter de même le connecteur
MySQL-Java dans le ClassPath
INP-HB/K. M. BROU BD avancées : Hibernate 42
IV. Mise en œuvre avec Eclipse
4.4. Créer le fichier de
configuration
◼ Fichier : hibernate.cfg.xml
◼ Clic sur le dossier src du projet
◼ Menu File/New/File
◼ Saisir le nom du fichier
hibernate.cfg.xml et cliquer sur
Finish
INP-HB/K. M. BROU BD avancées : Hibernate 43
IV. Mise en œuvre avec Eclipse
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property
name="connection.driver_class">com.mysql.jdbc.Driver</property>
Double clic sur le fichier <property
hibernate.cfg.xml name="connection.url">jdbc:mysql://localhost:3308/hibernate</property>
<property name="connection.username">root</property>
Saisir le code suivant : <property name="connection.password"></property>
<property name="dialect">org.hibernate.dialect.MySQLDialect
</property>
Vérifier le port de MySQL <property name="show_sql">true</property>
<mapping resource="wkp/Client.hbm.xml"/>
</session-factory>
</hibernate-configuration>
INP-HB/K. M. BROU BD avancées : Hibernate 44
IV. Mise en œuvre avec Eclipse
4.5. Créer les fichiers de
classe
◼ Fichiers :
Client.java
ClientTest.java
◼ Clic droit sur le dossier
src/New/Class
◼ Saisir le nom du package : wkp
◼ Saisir le nom de la classe : Client
◼ Clic sur Finish
INP-HB/K. M. BROU BD avancées : Hibernate 45
IV. Mise en œuvre avec Eclipse
package wkp;
public class Client {
private int id;
private String nom;
private String tel;
public Client() {
}
public Client(int id, String nom, String tel) {
this.id = id;
this.nom = nom;
this.tel = tel;
}
◼ Saisir le code suivant : public Client(String nom, String tel) {
this.nom = nom;
this.tel = tel;
}
public int getId() {
return id;
}
INP-HB/K. M. BROU BD avancées : Hibernate 46
IV. Mise en œuvre avec Eclipse
public void setId(int id) {
this.id = id;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
void afficher() {
System.out.println("Client(" + id + "," + nom + "," + tel + ")");
}
}
INP-HB/K. M. BROU BD avancées : Hibernate 47
IV. Mise en œuvre avec Eclipse
◼ De même créer la classe
ClientTest.java
INP-HB/K. M. BROU BD avancées : Hibernate 48
IV. Mise en œuvre avec Eclipse
public class ClientTest {
◼ Saisir le code suivant : public static void main(String[] args) {
package wkp; ServiceRegistry registry;
SessionFactory sessionFactory;
import java.io.Serializable; registry = new
StandardServiceRegistryBuilder().configure("hibernate.cfg.xml")
import org.hibernate.Session; .build();
import org.hibernate.SessionFactory; // Create the MetadataSources
import org.hibernate.boot.Metadata; MetadataSources sources = new MetadataSources(registry);
import org.hibernate.boot.MetadataSources; // Create the Metadata
import Metadata metadata = sources.getMetadataBuilder().build();
org.hibernate.boot.registry.StandardServiceRegistryBuilder; // Create SessionFactory
import org.hibernate.service.ServiceRegistry; sessionFactory = metadata.getSessionFactoryBuilder().build();
// opens a new session from the session factory
Session session = sessionFactory.openSession();
session.beginTransaction();
INP-HB/K. M. BROU BD avancées : Hibernate 49
IV. Mise en œuvre avec Eclipse
// Créer 3 nouveaux clients dans la BD
Client client1 = new Client("Toto", "3064040622");
session.persist(client1);
client1.afficher();
Client client2 = new Client("Froto", "0708304500");
Serializable id = session.save(client2);
System.out.println("created id: " + id);
client2.afficher();
Client client3 = new Client("Mankou", "2020202020");
session.persist(client3);
client3.afficher();
session.getTransaction().commit();
session.close();
}
}
INP-HB/K. M. BROU BD avancées : Hibernate 50
IV. Mise en œuvre avec Eclipse
4.6. Créer les fichiers de
mapping
◼ Fichiers :
Client.hbm.xml
◼ Clic sur le dossier src/wkp du
projet
◼ Menu File/New/File
◼ Saisir le nom du fichier
Client.hbm.xml et cliquer sur
Finish
INP-HB/K. M. BROU BD avancées : Hibernate 51
IV. Mise en œuvre avec Eclipse
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="wkp">
<class name="Client" table="Client">
<id name="id" column="numCl">
<generator class="increment"/>
</id>
<property name="nom" type="string" column="nom"/>
<property name="tel" type="string" column="tel"/>
</class>
</hibernate-mapping>
◼ Double clic sur le fichier
Client.hbn.xml
◼ Saisir le code suivant
INP-HB/K. M. BROU BD avancées : Hibernate 52
IV. Mise en œuvre avec Eclipse
4.7. Test Hibernate affiche les instructions
qui ont été exécutées
◼ Test 1 : Exécution d’un INSERT
▪ INSERT
Insérer 3 clients dans la table
Sinon dans hibernate.cfg.xml,
Client.
mettre show_sql à false
Démarrer le serveur Wamp
<property name="show_sql">false</property>
Exécuter le projet
Vérification dans MySQL
INP-HB/K. M. BROU BD avancées : Hibernate 53
IV. Mise en œuvre avec Eclipse
◼ Test 2 : Exécution d’un SELECT Exécuter le projet
Récupérer le client de numéro 2 Hibernate affiche les instruction
de la BD et dans le programme et qui ont été exécutées
le manipuler comme un objet. ▪ SELECT
Mettre les instructions de création
des 3 clients en commentaire
(lignes 33 à 49)
Ajouter le code suivant :
Client client4 = (Client) session.get(Client.class, 2);
if (client4 == null) {
System.out.println("Pas de client avec id = 2");
} else {
System.out.println("Nom client 2: " + client4.getNom());
client4.afficher();
}
INP-HB/K. M. BROU BD avancées : Hibernate 54
IV. Mise en œuvre avec Eclipse
◼ Afficher toute la table
Ajouter le code suivant :
//Afficher tous les enregistrements
for(int i=1; i <= 3; i++) {
Client client = (Client) session.get(Client.class, i);
client.afficher();
}
INP-HB/K. M. BROU BD avancées : Hibernate 55
IV. Mise en œuvre avec Eclipse
◼ Test 3 : Exécution d’un UPDATE Hibernate affiche les instructions
Modifier le téléphone du client de qui ont été exécutées
numéro 2. ▪ UPDATE
Mettre les instructions Vérification dans MySQL
précédentes en commentaire
Ajouter le code suivant :
Client client5 = (Client) session.load(Client.class, 2);
client5.setTel("0123456789");
session.update(client5);
client5.afficher();
session.getTransaction().commit();
INP-HB/K. M. BROU BD avancées : Hibernate 56
IV. Mise en œuvre avec Eclipse
◼ Test 4 : Exécution d’un DELETE Hibernate affiche les instruction
Supprimer le client de numéro 3. qui ont été exécutées
Mettre les instructions ▪ DELETE
précédentes en commentaire Vérification dans MySQL
Ajouter le code suivant :
Client client5 = (Client)
session.load(Client.class, 3);
session.delete(client5);
INP-HB/K. M. BROU BD avancées : Hibernate 57
IV. Mise en œuvre avec Eclipse
◼ Test 6 : Autre manière de faire un Hibernate affiche les instructions
DELETE qui ont été exécutées
Supprimer le client de numéro 1. ▪ DELETE
Mettre les instructions Vérification dans MySQL
précédentes en commentaire
Ajouter le code suivant :
Client client6 = new Client();
client6.setId(1);
client6.afficher();
session.delete(client6);
INP-HB/K. M. BROU BD avancées : Hibernate 58
IV. Mise en œuvre avec Eclipse
◼ Code complet // Créer les MetadataSources
MetadataSources sources = new MetadataSources(registry);
// Créer les Metadata
Metadata metadata = sources.getMetadataBuilder().build();
package wkp;
// Créer SessionFactory
sessionFactory = metadata.getSessionFactoryBuilder().build();
import java.io.Serializable;
// Ouvre une nouvelle session à partir de session factory
import org.hibernate.Session;
Session session1 = sessionFactory.openSession();
import org.hibernate.SessionFactory;
session1.beginTransaction();
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
public class ClientTest {
public static void main(String[] args) {
ServiceRegistry registry;
SessionFactory sessionFactory;
registry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
INP-HB/K. M. BROU BD avancées : Hibernate 59
IV. Mise en œuvre avec Eclipse
// Créer 3 nouveaux clients dans la BD
Client client1 = new Client("Toto", "3064040622"); // Modifier le numéro du client no 2
session1.persist(client1); Client client5 = (Client) session1.load(Client.class, 2);
client1.afficher(); client5.setTel("0123456789");
session1.update(client5);
Client client2 = new Client("Froto", "0708304500"); client5.afficher();
Serializable id = session1.save(client2);
System.out.println("created id: " + id); // Supprimer le client no 3 de la BD
client2.afficher(); Client client6 = (Client) session1.load(Client.class, 3);
session1.delete(client6);
Client client3 = new Client("Mankou", "2020202020");
session1.persist(client3); session1.getTransaction().commit();
client3.afficher(); session1.close();
// loads a new object from database
Client client4 = (Client) session1.get(Client.class, 2);
if (client4 == null) {
System.out.println("Pas de client avec id = 2");
}
else {
System.out.println("Nom client 2: " + client4.getNom());
client4.afficher();
}
INP-HB/K. M. BROU BD avancées : Hibernate 60
IV. Mise en œuvre avec Eclipse
Session session2 = sessionFactory.openSession();
session2.beginTransaction();
// Autre manière : Supprimer le client no 1 de la BD
Client client7 = new Client();
client7.setId(1);
client7.afficher();
session2.delete(client7);
// Validation de la transaction et fermeture de la session
session2.getTransaction().commit();
session2.close();
}
}
INP-HB/K. M. BROU BD avancées : Hibernate 61
IV. Mise en œuvre avec Eclipse
4.8. Test avec Oracle ◼ Fichier hibernate.cfg.xml
◼ Télécharger le connecteur ojdbc
ojdbc10.jar
https://www.oracle.com/databas
e/technologies/appdev/jdbc-ucp-
19c-downloads.html
◼ Création de la table Client
CREATE TABLE Client
(numCl NUMBER NOT NULL,
nom VARCHAR2(20),
tel VARCHAR2(10),
PRIMARY KEY(numCl)
);
INP-HB/K. M. BROU BD avancées : Hibernate 62
IV. Mise en œuvre avec Eclipse
◼ Fichier hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:BDORACLE</property>
<property name="connection.username">fatou</property>
<property name="connection.password">fatou</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
<mapping resource="wkp/Client.hbm.xml"/>
</session-factory>
</hibernate-configuration>
INP-HB/K. M. BROU BD avancées : Hibernate 63
IV. Mise en œuvre avec Eclipse
◼ Pas de changement pour les ◼ Lancer Eclipse
fichiers : Créer un projet java : HibernateOr
Client.hbm.xml Ajouter les .jar de Hibernate au
Client.java Classpath comme précédemment
ClientTest.java Ajouter ojdbc10.jar au Classpath
Créer les fichiers comme
précédemment
INP-HB/K. M. BROU BD avancées : Hibernate 64
IV. Mise en œuvre avec Eclipse
◼ Exécution : Vérifier le contenu de la table
ClientTest.java Client
INP-HB/K. M. BROU BD avancées : Hibernate 65
IV. Mise en œuvre avec Eclipse
TP Noté
◼ Créer une application ORM avec
Hibernate basée sur le
diagramme de classe suivant :
LigneCom
Client qteCom
numCl
Produit
nom 1 passe 1..* Commande 1..* 1..* numProd
adresse numCom
désignation
tel dateCom
* prixUnit
fax
qteStock
email
INP-HB/K. M. BROU BD avancées : Hibernate 66
IV. Mise en œuvre avec Eclipse
Webographie : ◼ https://www.codejava.net/fram
◼ Hibernate Quickly, Patrick Peak, eworks/hibernate/hibernate-
Nick Heudecker, Manning, 2006. hello-world-tutorial-for-
beginners-with-eclipse-and-
◼ Hibernate in Action, Christian
mysql
Bauer, Gavin King, Manning,
2005. ◼ https://www.codejava.net/fram
eworks/hibernate/writing-a-
◼ Harnessing Hibernate, James
basic-hibernate-based-program-
Elliot, Tim O’Brien, Ryan Fowler,
with-
O’Reilly, 2008.
eclipse?showall=1&limitstart=
◼ www.hibernate.org
◼ https://www.jmdoudoux.fr/java
/dej/chap-hibernate.htm
INP-HB/K. M. BROU BD avancées : Hibernate 67