0% ont trouvé ce document utile (0 vote)
0 vues67 pages

Ch 4 Hibernate

Ce document présente un chapitre sur l'ORM avec Hibernate, abordant les concepts de base du mapping objet-relationnel et l'utilisation d'Hibernate pour créer des applications. Il explique l'architecture d'Hibernate, les avantages de l'ORM, ainsi que les fichiers de mapping nécessaires pour relier les classes Java aux tables de base de données. Enfin, il décrit la structure des fichiers de configuration et les opérations CRUD associées.

Transféré par

kouaamon18
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
0 vues67 pages

Ch 4 Hibernate

Ce document présente un chapitre sur l'ORM avec Hibernate, abordant les concepts de base du mapping objet-relationnel et l'utilisation d'Hibernate pour créer des applications. Il explique l'architecture d'Hibernate, les avantages de l'ORM, ainsi que les fichiers de mapping nécessaires pour relier les classes Java aux tables de base de données. Enfin, il décrit la structure des fichiers de configuration et les opérations CRUD associées.

Transféré par

kouaamon18
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 67

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

Vous aimerez peut-être aussi