Vous êtes sur la page 1sur 16

Hibernate est un outil ORM (ObjectRelational Mapping) open source pour Java

Ce cours est un rapide survol de ses


possibilits

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

Recherche et enregistre les donnes


associes un objet dans une base de
donnes
Dtecte quand un objet a t modifi et
lenregistre en optimisant les accs la base

Avantages

Hibernate

page 4

Avantages

vite lcriture de code rptitif, inintressant


et source derreurs difficiles dceler
Gain de 30 40 % du nombre de lignes de
certains projets
Amliore la portabilit du code pour des
changements de SGBD

R. Grin

R. Grin

Hibernate

page 2

Fonctionnalits de base

Hibernate

Hibernate

page 5

Le dveloppeur pense en termes dobjet et


pas en termes de lignes de tables
Sans outil ORM le dveloppeur peut hsiter
concevoir un modle objet fin afin dviter
du codage complexe pour la persistance
Le refactoring du schma de la base de
donnes ou du modle objet est facilit

Hibernate

page 6

Pas toujours bnfique


Un type dapplications ne bnficie pas de
lutilisation dun outil ORM : celles qui
modifient un grand nombre de lignes pour
chaque update ou qui ne comportent
essentiellement que des requtes select de
type group by
En effet, en ce cas la manipulation dun grand
nombre dobjets nuit aux performances
Par exemple les applications OLAP (online
analytical processing), le data mining

R. Grin

Hibernate

page 7

Les classes persistantes


dans Hibernate

R. Grin

Hibernate

page 8

Contraintes obligatoires pour les


classes persistantes

Persistance pour POJOs


Au contraire dautres outils ou framework, les
objets persistants sont des POJOs (Plain Old
Java Objects)
Leur classe na pas besoin dimplmenter
certaines interfaces ou dhriter de certaines
classes
Quelques contraintes sont tout de mme
recommandes ou obligatoires

R. Grin

Hibernate

page 9

Elles doivent avoir un constructeur sans


paramtre (il peut tre priv, mais il est
prfrable quil soit accessible par le
paquetage)
Les collections qui reprsentent des
associations doivent tre types avec des
interfaces et pas des classes ; par exemple
List et pas ArrayList

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

Exemple de fichier de mapping


(en-tte)

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

Exemple de fichier de mapping


(suite)
<hibernate-mapping>
<class name="Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="increment"/>
nom accesseurs :
</id>
{get|set}Date
<property name="date"
type="timestamp"
column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping>
R. Grin

Hibernate

page 15

page 14

Attributs du tag property


column indique le nom de la colonne dans la
table relationnelle
Par dfaut, elle a le mme nom que la
proprit (attribut name )
type indique le type Hibernate de la
proprit ; Hibernate en dduit le type SQL et
le type Java
Par dfaut, il est dtermin par introspection
de la classe

R. Grin

Identificateur

Hibernate

page 16

Gnrateur de cls

Le tag id est obligatoire pour chaque classe


qui est reprsente par une table (une classe
composant nest pas reprsente par une
table)
Il indique quelle sera la cl primaire de la
table
Remarque : les sous-classes hritent des
identificateurs de leur classe mre

R. Grin

R. Grin

Hibernate

Hibernate

page 17

Le tag generator, sous-tag de id, indique


comment seront gnres les cls des objets
Le plus souvent les cls sont de type long,
int ou short et nont pas de signification
pour lapplication (une bonne pratique)

Hibernate

page 18

Valeurs pour lattribut class


increment : ne convient que si aucun autre
processus najoute des donnes dans la table
identity, sequence : la cl est une colonne
identity ou est gnre par une squence
hilo : une table contient la prochaine valeur
native : utilise un des moyens ci-dessus,
selon les possibilits du SGBD

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

Les diffrents tats


Nouveau : il vient dtre cr dans le code
Java ; il nest pas persistant
Persistant : il a t rendu persistant par
session.persist(objet)
ou bien il a t charg depuis la base de
donnes par une requte (session.get())
Toute modification des proprits de lobjet
sera automatiquement rpercute dans la
base

tats dun objet

R. Grin

Hibernate

page 21

R. Grin

Les diffrents tats

Hibernate

page 22

session.persist(objet)

Dtach : il a t persistant mais la session


qui le grait a t ferme ; on peut crer une
autre session et le rattacher cette nouvelle
session (par session.update(objet))

Rend lobjet pass en paramtre persistant


Une commande SQL INSERT ne sera
excute quau moment o la mthode
session.commit() sera lance

Transient : un objet persistant ou dtach


peut tre rendu non persistant par lappel de
session.delete(objet)

R. Grin

Hibernate

page 23

R. Grin

Hibernate

page 24

Rcuprer lidentificateur dun objet


persist renvoie un Serializable qui est
lidentificateur utilis pour sauvegarder lobjet
dans la base
Si lidentificateur est un long on peut le
rcuprer par :
Long id =
(Long)session.persist(objet);

R. Grin

Hibernate

page 25

Persistance par transitivit


(ou par rfrence)

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

Quand on rend un objet non persistant, on


risque de supprimer de la base des valeurs
utilises par un autre objet persistant
Donc pratiquement la persistance par
transitivit nest pas si simple mettre en
uvre

Par dfaut, Hibernate neffectue pas de


persistance par transitivit
Pour que les objets associs un objet
persistant deviennent automatiquement
persistants, il faut lindiquer dans le fichier de
mapping de la classe de lobjet persistant
Ce comportement est moins sr mais permet
plus de souplesse, souvent pour obtenir de
meilleures performances

Hibernate

Hibernate

page 28

Attribut cascade

Le choix dHibernate

R. Grin

page 26

Un problme difficile

Hibernate

Hibernate

page 29

Les tags qui dcrivent les associations entre


objets peuvent avoir un attribut cascade qui
indique le comportement dHibernate pour la
persistance par transitivit
Par dfaut, la valeur de lattribut est none :
lobjet ou les objets rfrencs par cette
association ne seront pas rendus persistants
automatiquement par un persist de lobjet
rfrenant

R. Grin

Hibernate

page 30

Possibilits de cascade (1)

Possibilits de cascade (2)

save-update : Hibernate suivra


lassociation lors des appels persist ou
update (persistance automatique des objets
rfrencs)
delete : Hibernate suivra lassociation lors
des appels delete (les objets rfrencs
seront automatiquement rendus non
persistants)
all : les 2 prcdents

R. Grin

R. Grin

Hibernate

page 31

delete-orphan : tout objet associ qui est


retir de lassociation sera rendu non
persistant
all-delete-orphan : comme all et
delete-orphan runis (convient bien si les
objets rfrencs ne peuvent exister en
dehors de lassociation)

Hibernate

page 32

Exemple

Si on suppose quune adresse nexiste pas


sans une personne, et quune personne peut
avoir plusieurs adresses, on aura dans le
fichier de mapping de la classe Personne :
<set name="adresses"
table="ADRESSE"
cascade="all-delete-orphan"
. . .

R. Grin

Hibernate

page 33

Les associations

R. Grin

Une partie complexe

Hibernate

page 34

Types dassociation

Cest la partie la plus complexe si on veut


crire des applications performantes avec
Hibernate

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

Tags Hibernate pour les associations


Pour les collections : <set>, <list>, <map>,
<bag>, <array> et <primitive-array>
Les cardinalits avec les tags suivants : <oneto-one>, <one-to-many>, <many-toone>, <many-to-many> (on ajoutera <join>
pour un cas particulier)

Dtails tags pour les collections

R. Grin

Hibernate

page 37

<bag> (sac) : une collection non ordonne


qui peut contenir plusieurs fois le mme
lment (au contraire dun set)
<primitive-array> : un tableau de type
primitif (int[] par exemple)

R. Grin

Hibernate

page 38

Exemple dassociation N-1

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

Cas de lassociation unidirectionnelle Employ


> Dpartement :

<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

Si lassociation est bidirectionnelle

public class Employe {


private Departement dept;
. . .
public Departement getDept() {
return dept;
}
public void setDept(Departement dept) {
this.dept = dept;
}
}

R. Grin

Hibernate

page 41

public class Departement {


private Set employes = new HashSet();
. . .
public Set getEmployes() {
return employes;
}
public void setEmployes(Set employes) {
this.employes = employes;
}
}

R. Grin

Hibernate

page 42

Fichier de mapping de Departement

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

Pas de gestion automatique des


associations bidirectionnelles
Au contraire des containers dEJB entits,
Hibernate nautomatise pas la synchronisation
des 2 bouts dune association
Si une association est bidirectionnelle, le
programmeur doit grer cette synchronisation

Attention, ce fichier est


incomplet
page 43

R. Grin

Problme 1

Hibernate

page 44

Problme 1 (suite)

Dans le code Java, il ne faut donc pas oublier


de grer les 2 cts de lassociation
Par exemple, si on ajoute un employ dans un
dpartement :

employe.setDept(dept);
dept.getEmployes().add(employe);

Pour faciliter la programmation, on ajoute


souvent cette mthode dans Departement :

On peut maintenant rendre private la


mthode getEmployes de la classe
Departement pour une meilleure conception
(encapsulation)
En effet, si Hibernate conseille davoir des
accesseurs/modificateurs pour les proprits
persistantes, ceux-ci peuvent tre private

public void addEmploye(Employe emp) {


employes.add(emp);
emp.setDept(this);
}
R. Grin

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

Le fichier de mapping complet

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

Exemple dassociation M-N

Les associations M-N sont traduites en


relationnel par une table association
En objet elles sont traduites par des collections
Dans le fichier de mapping on aura donc un
tag collection pour indiquer lassociation ;
ce tag collection indiquera les noms des
colonnes de la table association
Le nom de la colonne qui rfrence la table
correspondant la classe du fichier de
mapping est indiqu par le tag key

R. Grin

Hibernate

page 49

Association M-N qui traduit la participation dun


employ un projet
Pour enregistrer une nouvelle participation, le
code
n doit ajouter le projet dans la collection de la
classe Employe des projets auxquels
lemploy participe
n et il doit aussi ajouter lemploy dans la
collection de la classe Projet des employs
qui participent au projet

R. Grin

Code Java

public void addProjet(Projet projet) {


this.getProjets().add(projet);
projet.getEmployes().add(this);
}

Hibernate

page 50

Fichiers de mapping

Mthode de la classe Employ qui ajoute la


participation dune personne un vnement
(il faut choisir une des 2 classes pour ajouter
ce type de mthode) :

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

Contrainte pour le code Java

Les associations doivent tre types avec


des interfaces : Set, Collection, Map ou
SortedMap

Hritage

En effet, Hibernate utilisera ses propres


classes pour implmenter ces interfaces
Il pourra ainsi faire des chargements retards
(lazy) et suivre les ajouts et les suppressions
dans les associations pour grer la
persistance transitive (attributs cascade )

R. Grin

Hibernate

page 53

R. Grin

Hibernate

page 54

Stratgie
une seule table par hirarchie

Hibernate supporte les 3 stratgies


principales pour la correspondance en
relationnel des hirarchies dhritage

R. Grin

Hibernate

page 55

Il faut utiliser les sous-tags suivant du tag


<class> dans les fichiers de mapping :
n <discriminator> indique la colonne de la
table qui contient la valeur qui permet de
diffrencier les lignes correspondant aux sousclasses dans la table
n <subclass> introduit une sous-classe de la
racine de la hirarchie ; ce tag peut contenir
lui-mme des sous-tags <subclass>

R. Grin

Exemple

Hibernate

page 57

<subclass name="CarteCredit"
discriminator-value="CC">
<property name="type"
column="TYPE_CC"/>
...
</subclass>
...
</class>
</hibernate-mapping>

R. Grin

On utilise le sous-tag <joined-subclass>


du tag <class> ; il peut contenir lui-mme
des sous-tags <joined-subclass>

Ce sous-tag contient lui-mme un sous-tag


<key> qui permet dindiquer la cl primaire
de la sous-classe, qui est aussi une cl
trangre vers la cl primaire de la classe
mre

Hibernate

page 59

Hibernate

page 58

Exemple

Stratgie une table par classe

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

Chaque classe concrte est dfinie part


Les fichiers de mapping ne font pas rfrence
aux autres classes

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

Retrouver des donnes

R. Grin

Hibernate

page 63

3 faons de retrouver des donnes

Langage HQL :

LAPI Criteria pour QBC (query by criteria) et


pour QBE (query by example) :

Hibernate

page 64

3 faons de retrouver des donnes

session.createQuery("from Employe e where


e.nome like 'Dup%'");

R. Grin

SQL direct avec mapping automatique du


rsultat avec les objets :
session.createSQLQuery("select {e.*} from
EMPLOYE {e} where NOM like 'Dup%'", "e",
Employe.class);

session.createCriteria(Employe.class).add
(Expression.like("nome", "Dup%"));

R. Grin

Hibernate

page 65

R. Grin

Hibernate

page 66

11

Quelle faon utiliser ?

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();

HQL est prconis pour les requtes


complexes

R. Grin

Hibernate

page 67

R. Grin

HQL Chanage des mthodes


List noms = session.createQuery("from
Employe e where e.nome like 'Dup%'")
.addOrder(Order.asc("nome"))
.setFirstResult(0)
.setMaxResults(20)
.list();

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

2 possibilits pour paramtrer les requtes


n la JDBC (avec des ? )
n Avec des paramtres nomms (:nomparam)
Les paramtres nomms sont recommands :
n les paramtres de position sont plus
sensibles aux modifications (si on ajoute un
paramtre par exemple)
n un paramtre nomm peut apparatre
plusieurs fois dans une requte

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

Il est possible dattacher un objet entier un


paramtre :
session.createQuery(
"from Employe e where e.dept = :dept")
.setEntity("dept", dept)
.list();

page 73

R. Grin

Hibernate

page 74

Mode de rcupration eager

lazy

Avec ce mode on peut indiquer Hibernate


dinitialiser une collection
Dans les exemples suivants on indique
Hibernate dinitialiser les collections employes
des instances de Departement rcupres

Lorsquune requte rcupre des objets qui


contiennent une collection qui traduit une
association, cette collection nest pas
initialise sauf si on le demande explicitement
Exemple : si on rcupre un dpartement, la
collection des employs nest pas initialise
par dfaut
La collection ne sera initialise que lorsquelle
sera absolument ncessaire, par exemple si
on veut des informations sur un des employs

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

Quelques problmes et solutions


pour limplmentation

R. Grin

Hibernate

page 77

R. Grin

Hibernate

page 78

13

Dirty checking

Dirty checking

La 1re solution (interception) implique une


modification du code source ou, le plus
souvent, du bytecode
La 2me solution implique que lon puisse faire
une copie de lobjet (ou des valeurs de
lobjet) et que lon puisse comparer les
valeurs (souvent avec la mthode equals)

R. Grin

R. Grin

Hibernate

page 79

Pour savoir si on doit suivre les associations


1-N ou M-N qui partent dun objet persistant,
on doit aussi utiliser ses propres classes de
collection pour enregistrer les informations
ncessaires

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

Exemple de configuration (en-tte)

Il faut dcrire en particulier le SGBD utilis


pour la persistance
La configuration est contenue dans un fichier
hibernate.cfg.xml plac dans le
classpath

<?xml version='1.0' encoding='utf-8'?>


<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD
3.0//EN"
"http://hibernate.sourceforge.net/hiberna
te-configuration-3.0.dtd">

R. Grin

R. Grin

Hibernate

page 83

Hibernate

page 84

14

session-factory

session-factory

Un tag session-factory par base de


donnes (le plus souvent, une seule base) :

<hibernate-configuration>
<session-factory>
. . .
</session-factory>
<session-factory>
. . .
</session-factory>
</hibernate-configuration>

R. Grin

Hibernate

page 85

Chaque session-factory contient les


informations pour obtenir une connexion la
base, le dialecte SQL (Oracle, DB2,) et
divers autres informations

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>

<!-- JDBC connection pool -->


<property name="connection.pool_size">1
</property>
<property name="dialect">
org.hibernate.dialect.OracleDialect
</property>
<!-- Affiche les ordres SQL excuts -->
<property name="show_sql">true</property>
<!-- Recre la base au dmarrage -->
<property
name="hbm2ddl.auto">create</property>
<mapping resource="Event.hbm.xml"/>

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

Exemple pour log4j (2)

Exemple pour log4j (1)


### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppen
der
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.Patte
rnLayout
log4j.appender.stdout.layout.ConversionPattern=%d{A
BSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=hibernate.log
log4j.appender.file.layout=org.apache.log4j.Pattern
Layout
log4j.appender.file.layout.ConversionPattern=%d{ABS
OLUTE} %5p %c{1}:%L - %m%n
R. Grin

Hibernate

page 91

### set log levels - for more verbose logging


change 'info' to 'debug'
log4j.rootLogger=warn, file
log4j.logger.net.sf.hibernate=info
### enable the following line if you want to track
down connection
### leakages when using
DriverManagerConnectionProvider
log4j.logger.net.sf.hibernate.connection.DriverMana
gerConnectionProvider=trace
### log JDBC bind parameters ###
log4j.logger.net.sf.hibernate.type=info
### log prepared statement cache activity ###
log4j.logger.net.sf.hibernate.ps.PreparedStatementC
ache=info
R. Grin

Requtes SQL

page 92

schemaexport

Hibernate affiche sur la console les requtes


SQL quil lance
Exemple daffichage :
Hibernate: insert into EVENTS
(EVENT_DATE, title, EVENT_ID) values (?,
?, ?)

R. Grin

R. Grin

Hibernate

Hibernate

page 93

Il peut aussi tre intressant dtudier les


commandes DDL (create table) lances
par Hibernate pour crer les tables
On peut ainsi voir si les fichiers de
configuration sont correctement crits

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