Vous êtes sur la page 1sur 33

Programmation Web Avancee

Hibernate

MAAJI Adam

1/36
Introduction

Hibernate :
Framework Java
Gestion de persistance des objets dans les BD relationnelles
Solution pour faire le lien entre la programmation objet et
les SGBD :
les acc`es `a la base de donnees sont geres par des objets et
des methodes Java.
les JavaBean masquent la structure et les specificites de la
BD.
Architecture

Elements necessaires :
Classe de persistance : une classe de JavaBean
pour lencapsulation des donnees dune table.
Correspondance entre la classe et la table : fichier de
mapping.
Proprietes de configuration : Informations permettant
la connexion `a la BD.
Architecture

Architecture

Application

Fichiers de mapping Classes de persistance

Proprits de configuration
Hibernate

Bases de donnes

4/36
Persistance

Non-persistance : Perte des objets manipules par une


application lors la fin dune session.
Persistance : Sauvegarde des objets manipules par une
application pour pouvoir les recreer lors dune autre
session.
Moyen : utilisation dune BD
Rendre une application persistante :
insertion et mise `a jour de donnees dans une BD.
a` partir de donnees XML de mani`ere similaire `a
la manipulation dobjets Java.
Gestion de la persistance

Plusieurs aspects :
Connexion `a la BD
Creation de tous les objets ou uniquement de ceux
necessaires
Transformation (mapping ) de la structure de la BD
pour ladapter aux objets
Chargement en memoire des donnees en une seule fois ou
au fur et `a mesure
Hibernate : Framework en charge de la persistance des donnees
dans une application Web
Configuration

Fichier de mapping (nom du fichier : nom de la


classe, extension .hbm.xml)
Configuration de Hibernate (hibernate.cfg.xml)
Fichier de mapping

Chargement et stockage des donnees persistantes


Indication des tables et de la BD `a
utiliser
Definition de la structure des tables
Definition des cles primaires
Correspondance entre les noms et les types des objets et
les noms des colonnes
Exemple de fichier de mapping
fichier Event.hbm.xml

<? x m l v e r s i o n = 1 . 0 ?>
<! DOCTYPE h i b e r n a t e m a p p i n g PUBLIC
// H i b e r n a t e /H i b e r n a t e M a p p i n g DTD 3 . 0 / / EN
h t t p : / /h i b e r n a t e . s o u r c e f o r g e . n e t /h i b e r n a t e m a p p i n g 3 . 0 . d t d >

<h i b e r n a t e m a p p i n g>
< c l a s s name= e v e n t s . E v e n t t a b l e =EVENTS>
<i d name= i d c o l u m n= EVENT ID >
<g e n e r a t o r c l a s s = n a t i v e />
</i d>
<p r o p e r t y name= d a t e t y p e= t i m e s t a m p c o l u m n=EVENT DATE />
<p r o p e r t y name= t i t l e />

<s e t name= p a r t i c i p a n t s t a b l e =PERSON EVENT i n v e r s e = t r u e >


<k e y c o l u m n= EVENT ID />
<manyt omany c o l u m n= PERSON ID c l a s s = e v e n t s . P e r s o n />
</s e t>
</ c l a s s>
</h i b e r n a t e m a p p i n g>

10/36
Explications

Balise hibernate-mapping : definition des mappings


Balise class : definition de la classe et de la table concernees
par le mapping
classe : events.Event
table : EVENTS
Explications

Balise id : declaration de la propriete de lidentifiant


name="id" : identifiant Java conduisant Hibernate `a utiliser
les getter/setter standard (getId/setId )
generator : strategie de generation de lidentifiant
native : choix entre les valeurs identity (colonne du
SGBD), sequence (sequence fournie par le SGBD) ou hilo
(generation specifique `a Hibernate)
increment : identifiants entiers (`a utiliser lorsque quaucun
autre processus acc`ede `a la table
Possibilite decrire sa propre strategie de generation
didentifiant
Explications

Propriete title :
le nom de la propriete est le nom de la colonne
determination du type de mapping et de la conversion par
Hibernate
Propriete date :
attribut column : correspondance avec la colonne EVENT DATE
(date pouvant etre reserve)
attribut type : specification du type de mapping et de la
conversion
Balise set : definition dune association (table PERSON EVENT)
NB : le mapping pour la table PERSON est `a ecrire
Configuration de Hibernate

Fichier hibernate.properties ou
hibernate.cfg.xml (prioritaire) Balise hibernate-
configuration : configuration de hibernate pour
lapplication courante
Balise session-factory : Fabrique de session
Definition des param`etres de connexion
Pilote du SGBD (propriete connection.driver class)

Autres valeurs possibles :


com.mysql.jdbc.Driver (MySQL)
org.postgresql.Driver (Postgresql)
oracle.jdbc.driver.OracleDriver (Oracle)
Configuration de Hibernate
Definition des param`etres de connexion (suite)
Dialecte SQL `a utiliser (propriete dialect)
Autres valeurs :
org.hibernate.dialect.MySQLDialect (MySQL)
org.hibernate.dialect.PostgreSQLDialect (Postgresql)
org.hibernate.dialect.OracleDialect,
org.hibernate.dialect.Oracle10gDialect (Oracle)
Fichiers de mapping : balise mapping
Propriete hbm2ddl.auto
comportement au demarrage du serveur de BD Hibernate
(validation, mise `a jour de la BD existante, suppression et
creation de la BD)
valeurs possibles : validate, update, create, create-drop)
cette propriete est `a supprimer pour garder les informations
entre deux arret du serveur BD Hibernate
Mise en uvre

Exemple de fichier de configuration Hibernate


hibernate.cfg.xml
<? x m l v e r s i o n = 1 . 0 e n c o d i n g= u t f 8 ?>
<! DOCTYPE h i b e r n a t e c o n f i g u r a t i o n PUBLIC
// H i b e r n a t e /H i b e r n a t e C o n f i g u r a t i o n DTD 3 . 0 / / EN
h t t p : / /h i b e r n a t e . s o u r c e f o r g e . n e t /h i b e r n a t e c o n f i g u r a t i o n 3 . 0 . d t d >

<h i b e r n a t e c o n f i g u r a t i o n>
<s e s s i o n f a c t o r y>
<! D a t a b a s e c o n n e c t i o n s e t t i n g s >
<p r o p e r t y name= c o n n e c t i o n . d r i v e r c l a s s >o r g . h s q l d b . j d b c D r i v e r</ p r o p e r t y>
<p r o p e r t y name= c o n n e c t i o n . u r l > j d b c : h s q l d b : h s q l : / / l o c a l h o s t</ p r o p e r t y>
<p r o p e r t y name= c o n n e c t i o n . u s e r n a m e >s a</ p r o p e r t y>
<p r o p e r t y name= c o n n e c t i o n . p a s s w o r d ></ p r o p e r t y>

<! JDBC c o n n e c t i o n p o o l ( u s e t h e b u i l t i n ) >


<p r o p e r t y name= c o n n e c t i o n . p o o l s i z e >1</ p r o p e r t y>

<! SQL d i a l e c t >


<p r o p e r t y name= d i a l e c t >o r g . h i b e r n a t e . d i a l e c t . H S Q L D i a l e c t</ p r o p e r t y>

<! E n a b l e H i b e r n a t e s a u t o m a t i c s e s s i o n c o n t e x t m a n a g e m e n t >
<p r o p e r t y name= c u r r e n t s e s s i o n c o n t e x t c l a s s > t h r e a d </ p r o p e r t y >

<! D i s a b l e t h e s e c o n dl e v e l c a c h e >
<p r o p e r t y name= c a c h e . p r o v i d e r c l a s s > o r g . h i b e r n a t e . c a c h e . N o C a c h e P r o v i d e r
</ p r o p e r t y >

17/36
Mise en uvre

Exemple de fichier de configuration Hibernate


hibernate.cfg.xml

<! E c h o a l l e x e c u t e d SQL t o s t d o u t >


<p r o p e r t y name= s h o w s q l >t r u e</ p r o p e r t y>

<! D r o p a n d r ec r e a t e t h e d a t a b a s e s c h e m a o n s t a r t u p >
<p r o p e r t y name= h b m 2 d d l . a u t o >c r e a t e</ p r o p e r t y>

<m a p p i n g r e s o u r c e = e v e n t s /E v e n t . hbm . x m l />


<m a p p i n g r e s o u r c e = e v e n t s /P e r s o n . hbm . x m l />
</s e s s i o n f a c t o r y>
</h i b e r n a t e c o n f i g u r a t i o n>

18/36
Classe de persistance

Classe JavaBean
Utilisation de convention de nommage JavaBean pour
les methodes getter et setter
Visibilite des champs : privee
Visibilite de la classe : public recommandee
Contraintes :
Propriete obligatoire : id
Constructeur sans argument obligatoire
Mise en uvre

Exemple de classe de persistance


p a ck a g e e v e n ts ;

im p o r t j a v a . u ti l . ;

p u b l i c c l a s s Even t {
p r i v a te L o ng i d ;

p r i v a te S t r i n g t i t l e ;
p r i v a te D at e d a t e ;

p u b l i c E v e n t ( ) {}
p u b l i c Long g e tI d ( ) {
r e tu r n i d ;
}
p r i v a te v o i d s e t I d ( Long i d ) {
th i s . i d = i d ;
}
p u b l i c Date g e t D a t e ( ) {
r e tu r n d a t e ;
}
p u b l i c v o i d s e t D a t e ( Date d a t e ) {
th i s . d a t e = d a t e ;
}

20/36
Exemple de classe de persistance

p u b l i c S tr i n g g e tT i tl e ( ) {
r e tu r n t i t l e ;
}
p u b l i c v o i d s e tT i tl e ( S tr i n g t i t l e ) {
th i s . t i t l e = t i t l e ;
}
p r i v a t e S e t p a r t i c i p a n t s = new H a s h S e t ( ) ;
p u b l i c S e t g e tP a r ti c i p a n ts ( ) {
r e tu r n p a r t i c i p a n t s ;
}
p u b l i c v o i d s e tP a r ti c i p a n ts ( S e t p a r ti c i p a n ts ) {
th i s . p a r ti c i p a n ts = p a r ti c i p a n ts ;
}
}

21/36
Gestion de la session

Fichier HibernateUtil.java
Demarrage de Hibernate
Creation de la fabrique de session SessionFactory
puis creation de la session (un thread )
Fichier HibernateUtil.java
p a ck a g e u ti l ;

im p o r t o r g . h i b e r n a te . ;
im p o r t o r g . h i b e r n a te . c f g . ;

public c la s s H i b e r n a te U ti l {

p r i v a te s ta ti c f i n a l S e s s i o n F a c to r y s e s s i o n F a c to r y ;

s ta ti c {
tr y {
// C r e a t e t h e S e s s i o n F a c t o r y f r o m h i b e r n a t e . c f g . xm l
s e s s i o n F a c t o r y = new C o n f i g u r a t i o n ( ) . c o n f i g u r e ( ) . b u i l d S e s s i o n F a c t o r y ( ) ;
} c a t c h ( T h rowa b le ex ) {
/ / Make s u r e y o u l o g t h e e x c e p t i o n , a s i t m i g h t b e s w a l l o w e d
Sys tem . e r r . p r i n tl n ( I n i t i a l S e s s i o n F a c to r y c r e a ti o n f a i l e d . + ex ) ;
t h r o w new E x c e p t i o n I n I n i t i a l i z e r E r r o r ( e x ) ;
}
}

p u b l i c s ta ti c S e s s i o n F a c to r y g e tS e s s i o n F a c to r y ( ) {
r e tu r n s e s s i o n F a c t o r y ;
}
}

23/36
Exemple dune class dexcution

user user1= new user(id, nom);


SessionFactory
sf=NewHibernateUtil.getSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
s.saveOrUpdate(user1);
s.getTransaction().commit();
s.close();
Exercice 1
Le langage de requte HQL

Hibernate Query Language (HQL) est un langage de requtes


orient objets qui permet de reprsenter des requtes SQL :
les entits utilises dans les requtes HQL sont des objets et
des proprits. La syntaxe de HQL et ses fonctionnalits de
base sont trs similaire SQL
Les mots cls HQL
Clause Description Syntaxe Exemple

from prcise la classe d'objets dont les from object from Personne as
occurrences [as pers
doivent tre retrouves. objectalias]
select prcise les proprits renvoyer. select pers.nom
Doit tre utilis avec une clause from Personne
from

where prcise une condition qui permet where from Personne as


de filtrer les occurrences condition pers where
retournes. pers.nom = ""

order prcise un ordre de tri sur une order by


by ou plusieurs proprits. L'ordre propriete
par dfaut est ascendant [asc|desc] [,
propriete] ...;

group prcise un critre de group by


by regroupement pour les rsultats propriete
retourns.
Les fonctions d'agrgation HQL
Fonction Syntaxe

count count( [distinct|all|*] object |


object.property )

sum sum( [distinct|all] object.property


)

avg avg( [distinct|all] object.property


)

max max( [distinct|all] object.property


)

min min( [distinct|all] object.property


)
La mise en uvre de HQL

Exemple : rechercher toutes les occurrences d'une table


Configuration config = new Configuration();
config.addClass(Personnes.class);
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
try {
List personnes = session.find("from Personnes");
for (int i = 0; i < personnes.size(); i++) {
Personnes personne = (Personnes) personnes.get(i);
System.out.println("nom = " + personne.getNomPersonne());
}
} finally {
session.close();
}
sessionFactory.close();
Exemple 2 :
SessionFactory sessionFactory = new
Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
try {
Query query = session.createQuery("from Personnes p where
p.nomPersonne = :nom");
query.setString("nom", "nom2");
Iterator personnes = query.iterate();
while (personnes.hasNext()) {
Personnes personne = (Personnes) personnes.next();
System.out.println("nom = " +
personne.getNomPersonne());
}
}
Exemple 3 :
Configuration config = new Configuration();
config.addClass(Personnes.class);
SessionFactory sessionFactory =
config.buildSessionFactory();
Session session = sessionFactory.openSession();

try {
int compteur = ( (Integer) session.iterate("select
count(*) from Personnes").intValue();
System.out.println("compteur = " + compteur);
}
Exercice 2
Ingnierie inverse (reverse engineering)
La rtro-ingnierie, ou ingnierie inverse ou inverse, est
l'activit qui consiste tudier un objet pour en dterminer
le fonctionnement interne ou la mthode de fabrication. Le
terme quivalent en anglais est reverse engineering.
Il s'agit de :
comprendre le fonctionnement de l'objet, pour tre en
mesure de l'utiliser correctement, de le modifier, ou
encore de s'assurer de son bon fonctionnement.
crer un nouvel objet ayant des fonctionnalits
identiques l'objet de dpart.
Exercice 3

Vous aimerez peut-être aussi