Introduction Hibernate
Universit de Nice Sophia-Antipolis
Version O 0.5 23/10/05
Richard Grin
R. Grin
Outil ORM
Automatise ou facilite la correspondance
entre des donnes stockes dans des objets
et une base de donnes relationnelle
Le plus souvent les donnes sont dcrites
dans des fichiers de configuration (souvent
XML)
Les principaux produits : TopLink dOracle
(commercial) et Hibernate (open source)
R. Grin
R. Grin
page 3
Avantages
Hibernate
page 4
Avantages
R. Grin
R. Grin
Hibernate
page 2
Fonctionnalits de base
Hibernate
Hibernate
page 5
Hibernate
page 6
R. Grin
Hibernate
page 7
R. Grin
Hibernate
page 8
R. Grin
Hibernate
page 9
R. Grin
Hibernate
page 10
Contraintes optionnelles
mais recommandes
Un des champs doit identifier une instance
parmi toutes les autres de la mme classe
Tous les champs qui sont persistants doivent
avoir un modificateur (setter) et un accesseur
(getter) ; ils peuvent tre privs
Les classes ne doivent pas tre final ; les
mthodes public ne doivent pas tre final
R. Grin
Hibernate
page 11
Fichiers de mapping
R. Grin
Hibernate
page 12
Fichier de mapping
Dcrit comment se fera la persistance des
objets dune classe
Format XML
Se place dans le mme rpertoire que la
classe et se nomme Classe.hbm.xml si la
classe sappelle Classe
R. Grin
Hibernate
page 13
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD
3.0//EN"
"http://hibernate.sourceforge.net/hiberna
te-mapping-3.0.dtd">
R. Grin
Hibernate
page 15
page 14
R. Grin
Identificateur
Hibernate
page 16
Gnrateur de cls
R. Grin
R. Grin
Hibernate
Hibernate
page 17
Hibernate
page 18
R. Grin
Hibernate
page 19
Cls significatives
Bien que les cls significatives ne soient pas
recommandes, ce choix peut tre impos par
les bases de donnes hrites dautres
applications
class="assigned" indique que cest
lapplication qui donnera la valeur la cl
Cest la valeur par dfaut pour lattribut class
R. Grin
Hibernate
page 20
R. Grin
Hibernate
page 21
R. Grin
Hibernate
page 22
session.persist(objet)
R. Grin
Hibernate
page 23
R. Grin
Hibernate
page 24
R. Grin
Hibernate
page 25
R. Grin
Le concept
Les objets rfrencs par un objet persistant
sont automatiquement persistants
Ainsi si on rend un objet persistant, tous les
objets rfrencs par cet objet sont rendus
persistants
Cest un comportement logique : un objet ne
serait pas vraiment persistant si une partie
des valeurs de ses proprits ntait pas
persistante
R. Grin
R. Grin
page 27
Hibernate
Hibernate
page 28
Attribut cascade
Le choix dHibernate
R. Grin
page 26
Un problme difficile
Hibernate
Hibernate
page 29
R. Grin
Hibernate
page 30
R. Grin
R. Grin
Hibernate
page 31
Hibernate
page 32
Exemple
R. Grin
Hibernate
page 33
Les associations
R. Grin
Hibernate
page 34
Types dassociation
R. Grin
Hibernate
page 35
Uni ou bidirectionnelle
Cardinalits correspondant aux associations
1-1, 1-N, N-1, M-N
R. Grin
Hibernate
page 36
R. Grin
Hibernate
page 37
R. Grin
Hibernate
page 38
Fichiers de mapping
On se place du point de vue de la classe dont
on dcrit le mapping
Si la classe contient une collection, on utilise
un tag de collection qui contient lui-mme un
tag indiquant la cardinalit de lassociation
Sinon, on utilise un des tags qui indique la
cardinalit
<class name="Employe">
<id name="id" column="employeId">
. . .
correspond au {get|set}Dept
</id>
du transparent suivant
. . .
<many-to-one name="dept"
column="NUM_DEPT"
class="Departement"/>
</class>
R. Grin
R. Grin
Hibernate
page 39
En Java
Hibernate
page 40
R. Grin
Hibernate
page 41
R. Grin
Hibernate
page 42
correspond au
<class name="Departement"
getEmployes du
table="DEPARTEMENT">
transparent prcdent
. . .
<set name="employes">
<key column="NUM_DEPT" />
<one-to-many class="Employe"/>
</set>
</class>
R. Grin
colonne de la table
EMPLOYE (pas
DEPARTEMENT) cl
trangre vers
DEPARTEMENT Hibernate
R. Grin
Problme 1
Hibernate
page 44
Problme 1 (suite)
employe.setDept(dept);
dept.getEmployes().add(employe);
Hibernate
page 45
R. Grin
Problme 2
Pour reprsenter lassociation en relationnel,
il suffit de positionner une cl trangre ; il ny
a pas 2 oprations faire comme en Java
On indique Hibernate de ne pas faire 2 fois
la mme opration en ajoutant un attribut
inverse dans le mapping de Departement :
<set name="employes" inverse="true">
<key column="NUM_DEPT" />
<one-to-many class="Employe"/>
</set>
Hibernate
page 46
R. Grin
Hibernate
page 47
<class name="Departement"
table="DEPARTEMENT">
. . .
<set name="employes"
inverse="true">
<key column="NUM_DEPT" />
<one-to-many class="Employe"/>
</set>
</class>
R. Grin
Hibernate
page 48
Association M-N
R. Grin
Hibernate
page 49
R. Grin
Code Java
Hibernate
page 50
Fichiers de mapping
R. Grin
Hibernate
page 51
<class name="Employe">
. . .
<set name="projets"
table="PARTICIPATION">
<key column="CODE_PROJET"/>
<many-to-many
class="Projet"
column="CODE_PROJET" colonne de la table
association qui
/>
rfrence la table
</class>
colonne de la table
EMPLOYE
association qui
rfrence la table
PROJET
R. Grin
Hibernate
page 52
Hritage
R. Grin
Hibernate
page 53
R. Grin
Hibernate
page 54
Stratgie
une seule table par hirarchie
R. Grin
Hibernate
page 55
R. Grin
Exemple
Hibernate
page 57
<subclass name="CarteCredit"
discriminator-value="CC">
<property name="type"
column="TYPE_CC"/>
...
</subclass>
...
</class>
</hibernate-mapping>
R. Grin
Hibernate
page 59
Hibernate
page 58
Exemple
R. Grin
page 56
Exemple (suite)
<hibernate-mapping>
<class name="Paiement"
table="PAIEMENT"
discriminator-value="P">
<id name="id" column="PAIEMENT_ID"
type="long">
<generator class="native"/>
</id>
<discriminator column="TYPE_PAIEMENT"
type="string"/>
<property name="proprietaire"
column="PROPRIETAIRE" type="string"/>
. . .
R. Grin
Hibernate
<hibernate-mapping>
<class name="Paiement"
table="PAIEMENT">
<id name="id" column="PAIEMENT_ID"
type="long">
<generator class="native"/>
</id>
<property name="proprietaire"
column="PROPRIETAIRE" type="string"/>
. . .
R. Grin
Hibernate
page 60
10
Stratgie
une table par classe concrte
Exemple (suite)
<joined-subclass name="CarteCredit"
table="CARTE_CREDIT">
<key column="CARTE_CREDIT_ID">
<property name="type"
column="TYPE_CC"/>
...
Nom de la colonne
</joined-subclass>
qui est cl primaire
...
de la table
</class>
CARTE_CREDIT et
</hibernate-mapping>
cl trangre vers la
table PAIEMENT
R. Grin
Hibernate
page 61
R. Grin
Hibernate
page 62
Requtes
Hibernate offre plusieurs faons de retrouver
des donnes enregistres dans la base
2 de ces faons utilisent une vision
totalement objet des donnes
Une 3me faon permet un accs direct par
SQL
R. Grin
Hibernate
page 63
Langage HQL :
Hibernate
page 64
R. Grin
session.createCriteria(Employe.class).add
(Expression.like("nome", "Dup%"));
R. Grin
Hibernate
page 65
R. Grin
Hibernate
page 66
11
HQL
Criteria crit = session.createQuery("from
Employe e where e.nome like 'Dup%'");
crit.addOrder(Order.asc("nome"));
crit.setFirstResult(0);
crit.setMaxResults(20);
List noms = crit.list();
R. Grin
Hibernate
page 67
R. Grin
R. Grin
Hibernate
Hibernate
page 68
Danger !
Il est dangereux de construire une requte
partir dune chane de caractres dont une
partie est constitue de chanes saisies par
un utilisateur
Il faut plutt utiliser les possibilits de
paramtrage offertes par Hibernate
page 69
R. Grin
Paramtres
Hibernate
page 70
la JDBC
String query =
"from Employe e where e.nom like ? and
e.dateEmbauche > ? ";
List noms =
session.createQuery(query)
.setString(0, "Dup%") // 0 et pas 1 !
.setDate(1, dateDebut)
.list();
de type Date
R. Grin
R. Grin
Hibernate
page 71
Hibernate
page 72
12
Paramtres nomms
setEntity
String query =
"from Employe e where e.nom like
:modeleNom";
List noms =
session.createQuery(query)
.setString("modeleNom", "Dup%")
.list();
R. Grin
Hibernate
page 73
R. Grin
Hibernate
page 74
lazy
R. Grin
Hibernate
page 75
Avec HQL :
from Departement d
left join fetch d.employes e
Avec Criteria :
criteria.setFetchMode("employes",
FetchMode.EAGER)
R. Grin
Hibernate
page 76
Dirty checking
Lorsque la transaction est valide il est inutile
denregistrer tous les objets enregistrs dans
la session
Il faut donc un moyens de connatre les
objets qui ont t modifis
Essentiellement 2 solutions :
n on intercepte les modifications pour
enregistrer si un objet a t modifi ou non
n on compare les valeurs des objets au
moment o on les rcupre et au moment
o on devrait les enregistrer
R. Grin
Hibernate
page 77
R. Grin
Hibernate
page 78
13
Dirty checking
Dirty checking
R. Grin
R. Grin
Hibernate
page 79
Hibernate
page 80
Lazy loading
Le plus souvent on a besoin de modifier le
code de lapplication
Par exemple, on remplace lobjet par un
proxy qui reprsente lobjet mais ne contient
pas tout ltat de lobjet
Dans le cas o on veut grer le chargement
ou pas des objets associs un objet
(associations 1-N ou M-N), on doit aussi
utiliser ses propres classes de collection
R. Grin
Hibernate
page 81
Configuration dHibernate
R. Grin
Hibernate
page 82
Configuration dHibernate
R. Grin
R. Grin
Hibernate
page 83
Hibernate
page 84
14
session-factory
session-factory
<hibernate-configuration>
<session-factory>
. . .
</session-factory>
<session-factory>
. . .
</session-factory>
</hibernate-configuration>
R. Grin
Hibernate
page 85
R. Grin
Hibernate
page 86
Connexion la base
Autres informations
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="connection.url">
jdbc:oracle:thin:@si.unice.fr:1521:INFO
</property>
<property name="connection.username">
toto
</property>
<property name="connection.password">
xxxxx
</property>
R. Grin
R. Grin
Hibernate
page 87
Hibernate
page 88
Fichier de log
Le fichier de configuration log4j.properties
doit se trouver dans le fichier src et recopi
pour lexcution dans le rpertoire
dexcution
Si le fichier jar log4jxxx.jar nest pas
visible, lAPI standard de logging sera utilis
par Hibernate
Il faut configurer le logging pour quil renvoie
les erreurs dans un fichier de log
Mise au point
R. Grin
Hibernate
page 89
R. Grin
Hibernate
page 90
15
Hibernate
page 91
Requtes SQL
page 92
schemaexport
R. Grin
R. Grin
Hibernate
Hibernate
page 93
Hibernate
page 94
Bibliographie
Hibernate In Action par Christian Bauer et
Gavin King, dition Manning
Traduction franaise : Hibernate, dition
CampusPress, collection Rfrence
R. Grin
Hibernate
page 95
16