Sie sind auf Seite 1von 45

Introduction au framework Nhibernate

pour la plateforme .NET


serge.tahe at istia.univ-angers.fr, dcembre 2!!
http"##tahe.developpe$.com
!#%&
1 Introduction l'ORM NHIBERNATE
'e document est une introduction succincte ( N)ibernate, l*+uivalent pour .Net du framework ,ava )ibernate. -our une
introduction compl.te on pourra lire "
Titre " N)ibernate in /ction, Auteur " -ierre-)enri 0uat, Editeur " 1anning, ISBN-13 " 234-!25252%22%
6n 781 97b:ect 8elational 1apper; est un ensemble de biblioth.+ues permettant ( un programme e<ploitant une base de
donnes d*e<ploiter celle-ci sans mettre d*ordres =>? e<plicites et sans conna@tre les particularits du =ABC utilis.
?e document est illustr par deu< solutions Disual =tudio 2! +u*on trouvera ( l*6rl
Ehttp"##tahe.developpe$.com#dotnet#nhibernateF.
Pr-requis
Cans une chelle Edbutant-intermdiaire-avancF, ce document est dans la partie EintermdiaireF. =a comprhension ncessite divers
pr-re+uis +u*on pourra trouver dans certains des documents +ue :*ai crits "
!. !n"!"e #$ %&&' " Ehttp"##tahe.developpe$.com#dotnet#csharp#F
2. ES(rin" Io#F, disponible ( l*url Ehttp"##tahe.developpe$.com#dotnet#springiocF. -rsente les bases de l*inversion de
contrGle 9Inversion of 'ontrol; ou in:ection de dpendances 9CependencH In:ection; du framework S(rin")Net
Ehttp"##www.springframework.netF.
Ces conseils de lecture sont parfois donns au dbut des paragraphes de ce document. Ils rfrencent les documents prcdents.
Outils
?es outils utiliss dans cette tude de cas sont librement disponibles sur le web. 'e sont les suivants 9dcembre 2!!; "
N*i+ern!te 3)% disponible ( l*6rl Ehttp"##nhforge.org#Cefault.asp<F
S(rin")net 1)3)% disponible ( l*6rl Ehttp"##www.springframework.netF. ?e framework =pring.net est tr.s riche. Nous
utiliserons ici +ue la biblioth.+ue +u*il am.ne pour faciliter l*utilisation du framwork Nhibernate.
o",net 1)%)1& disponible ( l*6rl Ehttp"##logging.apache.org#log%netF. 'e framework de logs est utilis par Nhibernate.
Nunit %)- disponible ( l*6rl Ehttp"##www.nunit.org#F. 'e framework de tests unitaires est l*+uivalent pour .Net du
framework ,6nit pour la plate-forme ,ava.
?e pilote /C7.NET I.%.% du =gbd 1H=>? & disponible ( l*6rl Ehttp"##dev.mHs+l.com#downloads#connector#netF
?*ensemble des Cll ncessaires au< pro:ets Disual =tudio 2! ont t rassembls dans un dossier Elibnet%F "
http"##tahe.developpe$.com
2#%&
1)1 ! (l!ce de NHIBERNATE d!ns une !rc*itecture )NET en couc*es
6ne application .NET utilisant une base de donnes peut Jtre architecture en couches de la faKon suivante "
?a couche EdaoF communi+ue avec le =ABC via l*/-I /C7.NET. 8appelons les principales mthodes de cette /-I.
En mode connect, l*application "
!. ouvre une conne<ion avec la source de donnes
2. travaille avec la source de donnes en lecture#criture
5. ferme la conne<ion
Trois interfaces /C7.NET sont principalement concernes par ces oprations "
I.+#onnection +ui encapsule les proprits et mthodes de la conne<ion.
I.+#o//!nd +ui encapsule les proprits et mthodes de la commande =>? e<cute.
I.!t!Re!der +ui encapsule les proprits et mthodes du rsultat d*un ordre =>? =elect.
'inter0!ce I.+#onnection
=ert ( grer la conne<ion avec la base de donnes. -armi les mthodes M et proprits P de cette interface on trouve les suivantes "
No/ T1(e
R2le
ConnectionString
-
c*!3ne de conne4ion ( la base. Elle prcise tous les param.tres ncessaires ( l*tablissement de la
conne<ion avec une base prcise.
Open
1
ouvre la conne<ion avec la base dfinie par ConnectionString
Close
1
ferme la conne<ion
BeginTransaction
1
dmarre une transaction.
State
-
tat de la conne<ion " ConnectionState.Closed, ConnectionState.Open, ConnectionState.Connecting,
ConnectionState.Executing, ConnectionState.Fetching, ConnectionState.Broken
=i Connection est une classe implmentant l*interface IDbConnection, l*ouverture de la conne<ion peut se faire comme suit "
1. IDbConnection connexion=new Connection();
2. connexion.ConnectionString=...;
3. connexion.Open();
'inter0!ce I.+#o//!nd
=ert ( e<cuter un ordre =>? ou une procdure stocke. -armi les mthodes M et proprits P de cette interface on trouve les
suivantes "
No/ T1(e
R2le
Coan!T"pe
-
indi+ue ce +u*il faut e<cuter - prend ses valeurs dans une numration "
- CommandType.Text " e<cute l*ordre =>? dfini dans la proprit CommandText. '*est la valeur par
dfaut.
- CommandType.StoredProcedure " e<cute une procdure stocke dans la base
Coan!Text
-
- le te<te de l*ordre =>? ( e<cuter si CommandTypeL CommandType.Text
- le nom de la procdure stocke ( e<cuter si CommandTypeL CommandType.StoredProcedure
Connection
-
la conne<ion IDbConnection ( utiliser pour e<cuter l*ordre =>?
Transaction
-
la transaction IDbTransaction dans la+uelle e<cuter l*ordre =>?
#araeters
-
la liste des param.tres d*un ordre =>? paramtr. ?*ordre update articles set prix!prix"#.# $here
http"##tahe.developpe$.com
5#%&
1
2
utilis!teur
B.
'ouche d*acc.s
au< donnes
Ed!oF
'onnecteur
EA.O)NETF
S5B.
'ouche
E/etierF
'ouche
E(rsent!tionF
No/ T1(e
R2le
id!%id a le param.tre Mid.
$xec%te&ea!er
1
pour e<cuter un ordre =>? Select. 7n obtient un ob:et IData&eader reprsentant le rsultat du
Select.
$xec%te'on(%er"
1
pour e<cuter un ordre =>? 'pdate( Insert( Delete. 7n obtient le nombre de lignes affectes par
l*opration 9mises ( :our, insres, dtruites;.
$xec%teScalar
1
pour e<cuter un ordre =>? Select ne rendant +u*un uni+ue rsultat comme dans " select count)"* +rom
articles.
Create#araeter
1
pour crer les param.tres IDbParameter d*un ordre =>? paramtr.
#repare
1
permet d*optimiser l*e<cution d*une re+uJte paramtre lors+u*elle est e<cute de multiples fois
avec des param.tres diffrents.
=i Command est une classe implmentant l*interface IDbCommand, l*e<cution d*un ordre =>? sans transaction aura la forme suivante
"
1. )) o%*ert%re connexion
2. IDbConnection connexion=...
3. connexion.Open();
+. )) pr,paration coan!e
-. IDbCoan! coan!e=new Coan!();
.. coan!e.Connection=connexion;
/. )) ex,c%tion or!re select
0. coan!e.Coan!Text=1select ...1;
2. IDbData&ea!er rea!er=coan!e.$xec%te&ea!er();
13. ...
11. )) ex,c%tion or!re %p!ate4 insert4 !elete
12. coan!e.Coan!Text=1insert ...1;
13. int nb5ignesIns,r,es=coan!e.$xec%te'on(%er"();
1+. ...
1-. )) 6eret%re connexion
1.. connexion.Close();
'inter0!ce I.!t!Re!der
=ert ( encapsuler les rsultats d*un ordre =>? Select. 6n ob:et IData&eader reprsente une table avec des lignes et des colonnes,
+u*on e<ploite s+uentiellement " d*abord la !.re ligne, puis la seconde, .... -armi les mthodes M et proprits P de cette interface
on trouve les suivantes "
No/ T1(e
R2le
7iel!Co%nt
-
le nombre de colonnes de la table IData&eader
8et'ae
1
,et-ame)i* rend le nom de la colonne nN i de la table IData&eader.
Ite
-
Item.i/ reprsente la colonne nN i de la ligne courante de la table IData&eader.
&ea!
1
passe ( la ligne suivante de la table IData&eader. 8end le boolen True si la lecture a pu se faire,
False sinon.
Close
1
ferme la table IData&eader.
8etBoolean
1
,etBoolean9i; " rend la valeur boolenne de la colonne nN i de la ligne courante de la table
IData&eader. ?es autres mthodes analogues sont les suivantes " ,etDateTime, ,etDecimal, ,etDouble,
,etFloat, ,etInt#0, ,etInt12, ,etInt03, ,etString.
8et*al%e
1
,et4alue9i; " rend la valeur de la colonne nN i de la ligne courante de la table IData&eader en tant +ue
tHpe ob5ect.
IsDB'%ll
1
IsDB-ull)i* rend True si la colonne nN i de la ligne courante de la table IData&eader n*a pas de valeur
ce +ui est sHmbolis par la valeur =>? N6??.
?*e<ploitation d*un ob:et IData&eader ressemble souvent ( ce +ui suit "
1. )) o%*ert%re connexion
2. IDbConnection connexion=...
3. connexion.Open();
+. )) pr,paration coan!e
-. IDbCoan! coan!e=new Coan!();
.. coan!e.Connection=connexion;
/. )) ex,c%tion or!re select
0. coan!e.Coan!Text=1select ...1;
2. IData&ea!er rea!er=coan!e.$xec%te&ea!er();
13. )) exploitation r,s%ltats
http"##tahe.developpe$.com
%#%&
11. w9ile(rea!er.&ea!()):
12. )) exploiter ligne co%rante
13. ...
1+. ;
1-. )) 6eret%re rea!er
1.. rea!er.Close();
1/. )) 6eret%re connexion
10. connexion.Close();
Cans l*architecture prcdente,
le connecteur E/C7.NETF est li au =ABC. /insi la classe implmentant l*interface EICb'onnectionF est "
la classe E1H=>?'onnectionF pour le =ABC 1H=>?
la classe E=>?'onnectionF pour le =ABC =>?=erver
?a couche EdaoF est ainsi dpendante du =ABC utilis. 'ertains frameworks 9?in+, Ibatis.net, N)ibernate; l.vent cette contrainte
en a:outant une couche supplmentaire entre la couche EdaoF et le connecteur E/C7.NETF du =ABC utilis. Nous utiliserons ici, le
framework EN)ibernateF.
'i-dessus, la couche EdaoF ne s*adresse plus au connecteur E/C7.NETF mais au framework N)ibernate +ui va lui prsenter une
interface indpendante du connecteur E/C7.NETF utilis. 'ette architecture permet de changer de =ABC sans changer la couche
EdaoF. =eul le connecteur E/C7.NETF doit Jtre alors chang.
1)% ! +!se de donnes e4e/(le
-our montrer comment travailler avec N)ibernate, nous utiliserons la base de donnes 1H=>? EdbpamOnhibernateF suivante "
en E!F, la base a trois tables "
EemploHesF " une table +ui enregistre les emploHes d*une cr.che
EcotisationsF " une table +ui enregistre des tau< de cotisations sociales
EindemnitesF " une table +ui enregistre des informations permettant de calculer la paie des emploHes
T!+le 6e/(lo1es7
http"##tahe.developpe$.com
&#%&
1
2
B.
'ouche d*acc.s
au< donnes
Ed!oF
'onnecteur
EA.O)NETF
S5B.
'ouche
E/etierF
'ouche
E(rsent!tionF
Pramework
ENHi+ern!teF
1
'ouche
E(rsent!tionF
'ouche
E/etierF S5B.
'onnecteur
EA.O)NETF
'ouche d*acc.s
au< donnes
Ed!oF
B.
utilis!teur
1
2
en E2F, la table des emploHs et en E5F, la signification de ses champs
?e contenu de la table pourrait Jtre le suivant "
T!+le 6cotis!tions7
en E%F, la table des cotisations et en E&F, la signification de ses champs
?e contenu de la table pourrait Jtre le suivant "
T!+le 6inde/nites7
http"##tahe.developpe$.com
I#%&
ID
cl primaire de tHpe autoincrement
<$&SIO'
nN de version de l*enregistrement
#&$'O=
prnom de l*emploHe
'O=
son nom
>D&$SS$
son adresse
C#
son code postal
<I55$
sa ville
I'D$='IT$?ID
cl trang.re sur INCE1NITE=9IC;
3
2
ID
cl primaire de tHpe autoincrement
<$&SIO'
nN de version de l*enregistrement
S$C@
tau< 9pourcentage; de cotisation pour la scurit
sociale
&$T&>IT$
tau< de cotisation pour la retraite
CS8D
tau< de cotisation pour la contribution sociale
gnralise dductible
CS8&DS
tau< de cotisation pour la contribution sociale
gnralise et la contribution au remboursement
de la dette sociale
5
4
en EIF, la table des indemnits et en E3F, la signification de ses champs
?e contenu de la table pourrait Jtre le suivant "
?*e<portation de la structure de la base vers un fichier =>? donne le rsultat suivant "
1. A
2. A Str%ct%re 6or t9e BcotisationsB table C
3. A
+.
-. C&$>T$ T>B5$ BcotisationsB (
.. BIDB bigint(23) 'OT '@55 a%to?increent4
/. BS$C@B !o%ble 'OT '@554
0. B&$T&>IT$B !o%ble 'OT '@554
2. BCS8DB !o%ble 'OT '@554
13. BCS8&DSB !o%ble 'OT '@554
11. B<$&SIO'B int(11) 'OT '@554
12. #&I=>&D E$D (BIDB)
13. ) $'8I'$=InnoDB >@TO?I'C&$=$'T=+ D$7>@5T CF>&S$T=latin1;
1+.
1-. A
1.. A Str%ct%re 6or t9e Bin!enitesB table C
1/. A
10.
12. C&$>T$ T>B5$ Bin!enitesB (
23. BIDB bigint(23) 'OT '@55 a%to?increent4
21. B$'T&$TI$'?GO@&B !o%ble 'OT '@554
22. B&$#>S?GO@&B !o%ble 'OT '@554
23. BI'DIC$B int(11) 'OT '@554
2+. BI'D$='IT$S?C#B !o%ble 'OT '@554
2-. BB>S$?F$@&$B !o%ble 'OT '@554
2.. B<$&SIO'B int(11) 'OT '@554
2/. #&I=>&D E$D (BIDB)4
20. @'I(@$ E$D BI'DIC$B (BI'DIC$B)
22. ) $'8I'$=InnoDB >@TO?I'C&$=$'T=2 D$7>@5T CF>&S$T=latin1;
33.
31. A
32. A Str%ct%re 6or t9e Beplo"esB table C
33. A
3+.
3-. C&$>T$ T>B5$ Beplo"esB (
3.. BIDB bigint(23) 'OT '@55 a%to?increent4
3/. B#&$'O=B *arc9ar(23) 'OT '@554
30. BSSB *arc9ar(1-) 'OT '@554
32. B>D&$SS$B *arc9ar(-3) 'OT '@554
+3. BC#B *arc9ar(-) 'OT '@554
+1. B<I55$B *arc9ar(33) 'OT '@554
+2. B'O=B *arc9ar(33) 'OT '@554
+3. B<$&SIO'B int(11) 'OT '@554
++. BI'D$='IT$?IDB bigint(23) 'OT '@554
+-. #&I=>&D E$D (BIDB)4
+.. @'I(@$ E$D BSSB (BSSB)4
+/. E$D B7E?$=#5OD$S?I'D$='IT$?IDB (BI'D$='IT$?IDB)4
http"##tahe.developpe$.com
3#%&
ID
cl primaire de tHpe autoincrement
<$&SIO'
nN de version de l*enregistrement
B>S$?F$@&$
coQt en euro d*une heure de garde
$'T&$TI$'?GO@&
indemnit en euro par :our de garde
&$#>S?GO@&
indemnit de repas en euro par :our de garde
I'D$='IT$S?C#
indemnits de congs paHs. '*est un pourcentage
( appli+uer au salaire de base.
7
6
+0. CO'ST&>I'T B7E?$=#5OD$S?I'D$='IT$?IDB 7O&$I8' E$D (BI'D$='IT$?IDB) &$7$&$'C$S Bin!enitesB
(BIDB)
+2. ) $'8I'$=InnoDB >@TO?I'C&$=$'T=/ D$7>@5T CF>&S$T=latin1;
7n notera, lignes I, 2 et 5I +ue les cls primaires IC ont l*attribut autoincrement. 'eci signifie +ue 1H=>? gn.rera
automati+uement les valeurs des cls primaires ( cha+ue a:out d*un enregistrement. ?e dveloppeur n*a pas ( s*en proccuper.
1)3 e (ro8et #$ de d/onstr!tion
-our introduire la configuration et l*utilisation de N)ibernate, nous utiliserons l*architecture suivante "
6n programme console E!F manipulera les donnes de la base de donnes prcdente E2F via le framework EN)ibernateF E5F. 'ela
nous am.nera ( prsenter "
les fichiers de configuration de N)ibernate
l*/-I de N)ibernate
?e pro:et 'R sera le suivant "
?es lments ncessaires au pro:et sont les suivants "
en E!F, les C?? dont a besoin le pro:et "
EN)ibernateF " la Cll du framework N)ibernate
E1H=+l.CataF " la Cll du connecteur /C7.NET du =ABC 1H=>?
Elog%netF " la Cll du framework N6nit permettant de gnrer des logs
en E2F, les classes images des tables de la base de donnes
en E5F, le fichier E/pp.configF +ui configure l*application tout enti.re, dont le framework EN)ibernateF
en E%F, des applications console de test
1)3)1 #on0i"ur!tion de l! conne4ion l! +!se de donnes
8evenons ( l*architecture de test "
http"##tahe.developpe$.com
4#%&
'onnecteur
EA.O)NETF
B.
Pramework
ENHi+ern!teF
2
-rogramme
console S5B.
M1S9
4
3
2
3
1
1
'i-dessus, EN)ibernateF doit pouvoir accder ( la base de donnes. -our cela, il a besoin de certaines informations "
le =ABC +ui g.re la base 91H=>?, =>?=erver, -ostgres, 7racle, ...;. ?a plupart des =ABC ont a:out au langage =>?
des e<tensions +ui leur sont propres. En connaissant le =ABC, N)ibernate peut adapter les ordres =>? +u*il met ( ce
=ABC. N)ibernate utilise la notion de di!lecte S9.
les param.tres de conne<ion ( la base de donnes 9nom de la base, nom de l*utilisateur propritaire de la conne<ion, son
mot de passe;
'es informations peuvent Jtre places dans le fichier de configuration E/pp.configF. Doici celui +ui sera utilis avec une base
1H=>? & "
1. HIxl *ersion=11.31 enco!ing=1%t6J01 IK
2. Hcon6ig%rationK
3. HLJJ sections !e con6ig%ration JJK
+. Hcon6igSectionsK
-. Hsection nae=1log+net1 t"pe=1log+net.Con6ig.5og+'etCon6ig%rationSectionFan!ler4log+net1 )K
.. Hsection nae=19ibernateJcon6ig%ration1 t"pe=1'Fibernate.C6g.Con6ig%rationSectionFan!ler4
'Fibernate1 )K
/. H)con6igSectionsK
0.
2.
13. HLJJ con6ig%ration 'Fibernate JJK
11. H9ibernateJcon6ig%ration xlns=1%rnCn9ibernateJcon6ig%rationJ2.21K
12. HsessionJ6actor"K
13. Hpropert"
nae=1connection.pro*i!er1K'Fibernate.Connection.Dri*erConnection#ro*i!erH)propert"K
1+. HLJJ
1-. Hpropert" nae=1connection.!ri*er?class1K'Fibernate.Dri*er.="SMlDataDri*erH)propert"K
1.. JJK
1/. Hpropert" nae=1!ialect1K'Fibernate.Dialect.="S(5-DialectH)propert"K
10. Hpropert" nae=1connection.connection?string1K
12. Ser*er=local9ost;Database=!bpa?n9ibernate;@i!=root;#w!=;
23. H)propert"K
21. Hpropert" nae=1s9ow?sMl1K6alseH)propert"K
22. Happing assebl"=1paJn9ibernateJ!eos1)K
23. H)sessionJ6actor"K
2+. H)9ibernateJcon6ig%rationK
2-.
2.. HLJJ T9is section contains t9e log+net con6ig%ration settings JJK
2/. HLJJ 'OT$ I=#O&T>'T$ C les logs ne sont pas acti6s par !,6a%t. Il 6a%t les acti*er par
prograe a*ec lNinstr%ction log+net.Con6ig.OlCon6ig%rator.Con6ig%re();
20. L JJK
22. Hlog+netK
33. HLJJ De6ine an o%tp%t appen!er (w9ere t9e logs can go) JJK
31. Happen!er nae=15og7ile>ppen!er1 t"pe=1log+net.>ppen!er.7ile>ppen!er4 log+net1K
32. Hpara nae=17ile1 *al%e=1log.txt1 )K
33. Hpara nae=1>ppen!To7ile1 *al%e=16alse1 )K
3+. Hla"o%t t"pe=1log+net.5a"o%t.#attern5a"o%t4 log+net1K
3-. Hpara nae=1Con*ersion#attern1 *al%e=1P! QPtR PJ-p Pc QPxR Slt;PO:a%t9;Sgt; J PPn1 )K
3.. H)la"o%tK
3/. H)appen!erK
30. Happen!er nae=15ogDeb%g>ppen!er1 t"pe=1log+net.>ppen!er.Deb%g>ppen!er4 log+net1K
32. Hla"o%t t"pe=1log+net.5a"o%t.#attern5a"o%t4 log+net1K
+3. Hpara nae=1Con*ersion#attern1 *al%e=1P! QPtR PJ-p Pc QPxR Slt;PO:a%t9;Sgt; J PPn1)K
+1. H)la"o%tK
+2. H)appen!erK
+3. Happen!er nae=1Console>ppen!er1 t"pe=1log+net.>ppen!er.Console>ppen!er4 log+net1K
++. Hla"o%t t"pe=1log+net.5a"o%t.#attern5a"o%t4 log+net1K
+-. Hpara nae=1Con*ersion#attern1 *al%e=1P! QPtR PJ-p Pc QPxR Slt;PO:a%t9;Sgt; J PPn1)K
+.. H)la"o%tK
+/. H)appen!erK
+0.
+2. HLJJ Set%p t9e root categor"4 set t9e !e6a%lt priorit" le*el an! a!! t9e appen!er(s) (w9ere
t9e logs will go) JJK
-3. HrootK
-1. Hpriorit" *al%e=1I'7O1 )K
http"##tahe.developpe$.com
2#%&
Pramework
ENHi+ern!teF
B.
-rogramme
console
'onnecteur
EA.O)NETF
S5B.
M1S9
-2. HLJJ
-3. Happen!erJre6 re6=15og7ile>ppen!er1 )K
-+. Happen!erJre6 re6=15ogDeb%g>ppen!er1)K
--. JJK
-.. Happen!erJre6 re6=1Console>ppen!er1)K
-/. H)rootK
-0.
-2. HLJJ Speci6" t9e le*el 6or soe speci6ic naespaces JJK
.3. HLJJ 5e*el can be C >554 D$B@84 I'7O4 T>&'4 $&&O&4 7>T>54 O77 JJK
.1. Hlogger nae=1'Fibernate1K
.2. Hle*el *al%e=1I'7O1 )K
.3. H)loggerK
.+. H)log+netK
.-. H)con6ig%rationK
lignes %-3 " dfinissent des sections de configuration dans le fichier E/pp.configF. 'onsidrons la ligne I "
Hsection nae=19ibernateJcon6ig%ration1 t"pe=1'Fibernate.C6g.Con6ig%rationSectionFan!ler4 'Fibernate1 )K
'ette ligne dfinit la section de configuration de N)ibernate dans le fichier E/pp.configF. Elle a deu< attributs " name et type.
l*attribut EnameF nomme la section de configuration. 'ette section doit Jtre ici dlimite par les balises
SnameT...S#nameT, ici Shibernate-configurationT...S#hibernate-configurationT des lignes !!-2%.
l*attribut EtHpeLclasse,C??F indi+ue le nom de la classe charge de traiter la section dfinie par l*attribut EnameF ainsi +ue la
C?? contenant cette classe. Ici, la classe s*appelle EN)ibernate.'fg.'onfiguration=ection)andlerF et se trouve dans la
C?? EN)ibernate.dllF. 7n se rappelle +ue cette C?? fait partie des rfrences du pro:et tudi.
'onsidrons maintenant la section de configuration de N)ibernate "
1. HLJJ con6ig%ration 'Fibernate JJK
2. H9ibernateJcon6ig%ration xlns=1%rnCn9ibernateJcon6ig%rationJ2.21K
3. HsessionJ6actor"K
+. Hpropert" nae=1connection.pro*i!er1K'Fibernate.Connection.Dri*erConnection#ro*i!erH)propert"K
-. HLJJ
.. Hpropert" nae=1connection.!ri*er?class1K'Fibernate.Dri*er.="SMlDataDri*erH)propert"K
/. JJK
0. Hpropert" nae=1!ialect1K'Fibernate.Dialect.="S(5-DialectH)propert"K
2. Hpropert" nae=1connection.connection?string1K
13. Ser*er=local9ost;Database=!bpa?n9ibernate;@i!=root;#w!=;
11. H)propert"K
12. Hpropert" nae=1s9ow?sMl1K6alseH)propert"K
13. Happing assebl"=1paJn9ibernateJ!eos1)K
1+. H)sessionJ6actor"K
1-. H)9ibernateJcon6ig%rationK
ligne 2 " la configuration de N)ibernate est ( l*intrieur d*une balise Shibernate-configurationT. ?*attribut <mlns 9Uml
Name=pace; fi<e la version utilise pour configurer N)ibernate. En effet, au fil du temps, la faKon de configurer
N)ibernate a volu. Ici, c*est la version 2.2 +ui est utilise.
ligne 5 " la configuration de N)ibernate est ici tout enti.re contenue dans la balise Ssession-factorHT 9lignes 5 et !%;. 6ne
session N)ibernate, est l*outil utilis pour travailler avec une base de donnes selon le schma "
ouverture session
travail avec la base de donnes via les mthodes de l*/-I N)ibernate
fermeture session
?a session est cre par une +actory, un terme gnri+ue dsignant une classe capable de crer des ob:ets. ?es lignes 5-!%
configurent cette +actory.
lignes %, I, 4, 2 " configurent la conne<ion ( la base de donnes cible. ?es principales informations sont le nom du =ABC
utilis, le nom de la base, l*identit de l*utilisateur et son mot de passe.
ligne % " dfinit le fournisseur de la conne<ion, celui aupr.s du+uel on demande une conne<ion vers la base de donnes. ?a
valeur de la proprit Econnection.providerF est le nom d*une classe N)ibernate. 'ette proprit ne dpend pas du =ABC
utilis.
ligne I " le pilote /C7.NET ( utiliser. '*est le nom d*une classe N)ibernate spcialise pour un =ABC donn, ici
1H=>?. ?a ligne I a t mise en commentaires, car elle n*est pas indispensable.
ligne 4 " la proprit EdialectF fi<e le dialecte =>? ( utiliser avec le =ABC. Ici c*est le dialecte du =ABC 1H=>?.
=i on change de =ABC, comment trouve-t-on le dialecte N)ibernate de celui-ci V 8evenons au pro:et 'R prcdent et double-
cli+uons sur la C?? EN)ibernateF dans l*onglet E8eferencesF "
http"##tahe.developpe$.com
!#%&
en E!F, l*onglet EE<plorateur d*ob:etsF affiche un certain nombre de C??, dont celles rfrences par le pro:et.
en E2F, la C?? EN)ibernateF
en E5F, la C?? EN)ibernateF dveloppe. 7n H trouve les diffrents espaces de noms 9namespace; +ui H sont dfinis.
en E%F, l*espace de noms EN)ibernate.CialectF oW l*on trouve les classes dfinissant les diffrents dialectes =>? utilisables.
en E&F, la classe du dialecte du =ABC 1H=>? &.
en EIF, l*espace de noms de la classe E1H=+lCataCriverF utilis ligne I ci-dessous "
1. HLJJ con6ig%ration 'Fibernate JJK
2. H9ibernateJcon6ig%ration xlns=1%rnCn9ibernateJcon6ig%rationJ2.21K
3. HsessionJ6actor"K
+. Hpropert" nae=1connection.pro*i!er1K'Fibernate.Connection.Dri*erConnection#ro*i!erH)propert"K
-. HLJJ
.. Hpropert" nae=1connection.!ri*er?class1K'Fibernate.Dri*er.="SMlDataDri*erH)propert"K
/. JJK
0. Hpropert" nae=1!ialect1K'Fibernate.Dialect.="S(5DialectH)propert"K
2. Hpropert" nae=1connection.connection?string1K
13. Ser*er=local9ost;Database=!bpa?n9ibernate;@i!=root;#w!=;
11. H)propert"K
12. Hpropert" nae=1s9ow?sMl1K6alseH)propert"K
13. Happing assebl"=1paJn9ibernateJ!eos1)K
1+. H)sessionJ6actor"K
1-. H)9ibernateJcon6ig%rationK
lignes 2-!! " la cha@ne de conne<ion ( la base de donnes. 'ette cha@ne est de la forme Xparam!Lval!Yparam2Lval2Y ...X.
?*ensemble des param.tres ainsi dfinis permet au pilote du =ABC de crer une conne<ion. ?a forme de cette cha@ne de
http"##tahe.developpe$.com
!!#%&
5
4
3
2
1
7
6
conne<ion est dpendante du =ABC utilis. 7n trouve les cha@nes de conne<ion au< principau< =ABC sur le site
Ehttp"##www.connectionstrings.com#F. Ici, la cha@ne XSer4er!localhost6Database!dbpam7nhibernate6'id!root6P$d!6X est une
cha@ne de conne<ion pour le =ABC 1H=>?. Elle indi+ue +ue "
Ser4er!localhost6 " le =ABC est sur la mJme machine +ue le client +ui cherche ( ouvrir la conne<ion
Database!dbpam7nhibernate6 " la base de donnes 1H=>? vise
'id!root6 " l*utilisateur +ui ouvre la conne<ion est l*utilisateur root
P$d!6 " cet utilisateur n*a pas de mot de passe 9cas particulier de cet e<emple;
ligne !2 " la proprit EshowOs+lF indi+ue si N)ibernate doit afficher dans ses logs, les ordres =>? +u*il met sur la base de
donnes. En phase de dveloppement, il est utile de mettre cette proprit ( EtrueF pour savoir e<actement ce +ue fait
N)ibernate.
ligne !5 " pour comprendre la balise SmappingT, revenons ( l*architecture de l*application "
=i le programme console tait un client direct du connecteur /C7.NET et +u*il voulait la liste des emploHs, il ferait e<cuter au
connecteur un ordre =>? Select, et il recevrait en retour un ob:et de tHpe IData&eader +u*il aurait ( traiter pour obtenir la liste des
emploHs dsire initialement.
'i-dessus, le programme console est le client de N)ibernate et N)ibernate est le client du connecteur /C7.NET. Nous verrons
ultrieurement +ue l*/-I de N)ibernate va permettre au programme console de demander la liste des emploHs. N)ibernate va
traduire cette demande en un ordre =>? Select +u*il va faire e<cuter au connecteur /C7.NET. 'elui-ci va lui rendre un ob:et de
tHpe IData&eader . / partir de cet ob:et, Nhibernate doit Jtre capable de construire la liste des emploHs +ui lui a t demande. '*est
par configuration +ue cela est rendu possible. / cha+ue table de la base de donnes est associ une classe 'R. /insi ( partir des
lignes de la table EemploHesF renvoHes par le IData&eader, N)ibernate va Jtre capable de construire une liste d*ob:ets reprsentant
des emploHs et rendre celle-ci au programme console. 'es relations t!+les :--; cl!sses sont cres dans des fichiers de
configuration. N)ibernate utilise le terme XmappingX pour dfinir ces relations.
8evenons ( la ligne !5 ci-dessous "
1. HLJJ con6ig%ration 'Fibernate JJK
2. H9ibernateJcon6ig%ration xlns=1%rnCn9ibernateJcon6ig%rationJ2.21K
3. HsessionJ6actor"K
+. Hpropert" nae=1connection.pro*i!er1K'Fibernate.Connection.Dri*erConnection#ro*i!erH)propert"K
-. HLJJ
.. Hpropert" nae=1connection.!ri*er?class1K'Fibernate.Dri*er.="SMlDataDri*erH)propert"K
/. JJK
0. Hpropert" nae=1!ialect1K'Fibernate.Dialect.="S(5-DialectH)propert"K
2. Hpropert" nae=1connection.connection?string1K
13. Ser*er=local9ost;Database=!bpa?n9ibernate;@i!=root;#w!=;
11. H)propert"K
12. Hpropert" nae=1s9ow?sMl1K6alseH)propert"K
13. Happing assebl"=1paJn9ibernateJ!eos1)K
1+. H)sessionJ6actor"K
1-. H)9ibernateJcon6ig%rationK
?a ligne !5 indi+ue +ue les fichiers de configuration t!+les :--; cl!sses seront trouvs dans l*assemblH Epam-nhibernate-demosF.
6n assemblH est l*e<cutable ou la C?? produit par la compilation d*un pro:et. Ici, les fichiers de mapping seront placs dans
l*assemblH du pro:et e<emple. -our conna@tre le nom de cet assemblH, il faut regarder les proprits du pro:et "
http"##tahe.developpe$.com
!2#%&
B.
-rogramme
console
'onnecteur
EA.O)NETF
S5B.
M1S9
Pramework
ENHi+ern!teF
en E!F, les proprits du pro:et
dans l*onglet E/pplicationF E2F, le nom de l*assemblH E5F +ui va Jtre gnr.
parce +ue le tHpe de sortie est E/pplication consoleF E%F, le fichier gnr ( la compilation du pro:et s*appellera Epam-
nhibernate-demos.e<eF. =i le tHpe de sortie tait EBiblioth.+ue de classesF E&F, le fichier gnr ( la compilation du pro:et
s*appellerait Epam-nhibernate-demos.dllF
l*assemblH est gnr dans le dossier Ebin#8eleaseF du pro:et EIF.
7n retiendra de l*e<plication prcdente +ue les fichiers de mapping t!+les :--; cl!sses devront Jtre dans le fichier Epam-
nhibernate-demos.e<eF EIF.
1)3)% #on0i"ur!tion du /!((in" t!+les :--;cl!sses
8evenons ( l*architecture du pro:et tudi "
en E!F le programme console utilise les mthodes de l*/-I du framework N)ibernate. 'es deu< blocs changent des
ob:ets.
en E2F, N)ibernate utilise l*/-I d*un connecteur .NET. Il met des ordres =>? vers le =ABC cible.
?e programme console va manipuler des ob:ets refltant les tables de la base de donnes. Cans ce pro:et, ces ob:ets et les liens +ui
les unissent au< tables de la base de donnes ont t placs dans le dossier EEntitesF ci-dessous "
http"##tahe.developpe$.com
!5#%&
6
5
2
3
4
1
Pramework
ENHi+ern!teF
B.
-rogramme
console
'onnecteur
EA.O)NETF
S5B.
M1S9
2 1
cha+ue table de la base de donnes fait l*ob:et d*une classe et d*un fichier de mapping entre les deu<
T!+le #l!sse
M!((in"
cotisations 'otisations.cs
'otisations.hbm.<ml
emploHes EmploHe.cs
EmploHe.hbm.<ml
indemnites Indemnites.cs
Indemnites.hbm.<ml
#.1.2.# 8apping de la table .cotisations/
'onsidrons la table EcotisationsF "
6ne ligne de cette table peut Jtre encapsule dans un ob:et de tHpe E'otisations.csF suivant "
1. naespace #a'FibernateDeos :
2. p%blic class Cotisations :
3. )) propri,t,s a%toatiM%es
+. p%blic *irt%al int I! : get; set; ;
-. p%blic *irt%al int <ersion : get; set; ;
.. p%blic *irt%al !o%ble Csg&!s : get; set; ;
/. p%blic *irt%al !o%ble Csg! : get; set; ;
0. p%blic *irt%al !o%ble Sec% : get; set; ;
2. p%blic *irt%al !o%ble &etraite : get; set; ;
13.
11. )) constr%cte%rs
12. p%blic Cotisations() :
13. ;
1+. )) ToString
1-. p%blic o*erri!e string ToString() :
1.. ret%rn string.7orat(1Q:3;U:1;U:2;U:3;R14 Csg&!s4 Csg!4 Sec%4 &etraite);
1/. ;
10. ;
12.
23. ;
7n a cr une proprit automati+ue pour chacune des colonnes de la table EcotisationsF. 'hacune de ces proprits doit Jtre
dclare virtuelle 94irtual; car N)ibernate est amen ( driver la classe et ( redfinir 9override; ses proprits. 'elles-ci doivent donc
Jtre virtuelles.
7n notera, ligne !, +ue la classe appartient ( l*espace de noms E-amN)ibernateCemosF.
?e fichier de mapping E'otisations.hbm.<mlF entre la table EcotisationsF et la classe E'otisationsF est le suivant "
http"##tahe.developpe$.com
!%#%&
ID
cl primaire de tHpe autoincrement
<$&SIO'
nN de version de l*enregistrement
S$C@
tau< 9pourcentage; de cotisation pour la scurit sociale
&$T&>IT$
tau< de cotisation pour la retraite
CS8D
tau< de cotisation pour la contribution sociale gnralise
dductible
CS8&DS
tau< de cotisation pour la contribution sociale gnralise
et la contribution au remboursement de la dette sociale
1. HIxl *ersion=11.31 enco!ing=1%t6J01 IK
2. H9ibernateJapping xlns=1%rnCn9ibernateJappingJ2.21
3. naespace=1#a'FibernateDeos1 assebl"=1paJn9ibernateJ!eos1K
+. Hclass nae=1Cotisations1 table=1COTIS>TIO'S1K
-. Hi! nae=1I!1 col%n=1ID1 %nsa*e!J*al%e=131K
.. Hgenerator class=1nati*e1 )K
/. H)i!K
0. H*ersion nae=1<ersion1 col%n=1<$&SIO'1)K
2. Hpropert" nae=1Csg&!s1 col%n=1CS8&DS1)K
13. Hpropert" nae=1Csg!1 col%n=1CS8D1)K
11. Hpropert" nae=1&etraite1 col%n=1&$T&>IT$1)K
12. Hpropert" nae=1Sec%1 col%n=1S$C@1)K
13. H)classK
1+. H)9ibernateJappingK
le fichier de mapping est un fichier Uml dfini ( l*intrieur de la balise Shibernate-mappingT 9lignes 2 et !%;
ligne % " la balise SclassT fait le lien entre une table de la base de donnes et une classe. Ici, la table E'7TI=/TI7N=F
9attribut table; et la classe E'otisationsF 9attribut name;. En .NET, une classe doit Jtre dfinie par son nom complet 9espace
de noms inclus; et par l*assemblH +ui la contient. 'es deu< informations sont donnes par la ligne 5. ?a premi.re
9namespace; peut Jtre trouve dans la dfinition de la classe. ?a seconde 9assemblH; est le nom de l*assemblH du pro:et.
Nous avons d:( indi+u comment trouver ce nom.
lignes &-3 " la balise SidT sert ( dfinir le mapping de la cl primaire de la table EcotisationsF.
ligne & " l*attribut name dsigne le champ de la classe E'otisationsF +ui va recevoir la cl primaire de la table
EcotisationsF. ?*attribut column dsigne la colonne de de la table EcotisationsF +ui sert de cl primaire. ?*attribut
unsa4ed94alue sert ( dfinir une cl primaire non encore gnre. 'ette valeur permet ( N)ibernate de savoir
comment sauvegarder un ob:et E'otisationsF dans la table EcotisationsF. =i cet ob:et ( un champ IdL, il fera une
opration =>? IN=E8T, sinon il fera une opration =>? 6-C/TE. ?a valeur de unsa4ed94alue dpend du tHpe
du champ Id de la classe E'otisationsF. Ici, il est de tHpe int et la valeur par dfaut d*un tHpe int est . 6n ob:et
E'otisationsF encore non sauvegard 9sans cl primaire donc; aura donc son champ IdL. =i le champ Id avait t
de tHpe Ob5ect ou driv, on aurait crit unsa4ed94alue!null.
ligne I " lors+ue N)ibernate doit sauvegarder un ob:et E'otisationsF avec un champ IdL, il doit faire sur la base
de donnes une opration IN=E8T au cours de la+uelle il doit obtenir une valeur pour la cl primaire de
l*enregistrement. ?a plupart des =ABC ont une mthode propritaire pour gnrer automati+uement cette valeur.
?a balise SgeneratorT sert ( dfinir le mcanisme ( utiliser pour la gnration de la cl primaire. ?a balise
Sgenerator classLXnativeXT indi+ue +u*il faut utiliser le mcanisme par dfaut du =ABC utilis. Nous avons vu
page 4 +ue les cls primaires des nos trois tables 1H=>? avaient l*attribut autoincrement. ?ors de ses oprations
IN=E8T, N)ibernate ne fournira pas de valeur ( la colonne IC de l*enregistrement a:out, laissant 1H=>?
gnrer cette valeur.
ligne 4 " la balise SversionT sert ( dfinir la colonne de la table 9ainsi +ue le champ de la classe +ui va avec; +ui permet de
XversionnerX les enregistrements. /u dpart, la version vaut !. Elle est incrmente ( cha+ue opration 6-C/TE. C*autre
part, toute opration 6-C/TE ou CE?ETE est faite avec un filtre Z)E8E ICL id /NC DE8=I7NLv!. 6n utilisateur
ne peut donc modifier ou dtruire un ob:et +ue s*il a la bonne version de celui-ci. =i ce n*est pas le cas, une e<ception est
remonte par N)ibernate.
ligne 2 " la balise SpropertHT sert ( dfinir un mapping de colonne normale 9ni cl primaire, ni colonne de version;. /insi
la ligne 2 indi+ue +ue la colonne CS,&DS de la table E'7TI=/TI7N=F est associe ( la proprit Csg&ds de la classe
E'otisationsF.
#.1.2.2 8apping de la table .indemnites/
'onsidrons la table EindemnitesF "
6ne ligne de cette table peut Jtre encapsule dans un ob:et de tHpe EIndemnitesF suivant "
http"##tahe.developpe$.com
!&#%&
ID
cl primaire de tHpe autoincrement
<$&SIO'
nN de version de l*enregistrement
B>S$?F$@&$
coQt en euro d*une heure de garde
$'T&$TI$'?GO@&
indemnit en euro par :our de garde
&$#>S?GO@&
indemnit de repas en euro par :our de garde
I'D$='IT$S?C#
indemnits de congs paHs. '*est un pourcentage
( appli+uer au salaire de base.
1. naespace #a'FibernateDeos :
2. p%blic class In!enites :
3.
+. )) propri,t,s a%toatiM%es
-. p%blic *irt%al int I! : get; set; ;
.. p%blic *irt%al int <ersion : get; set; ;
/. p%blic *irt%al int In!ice : get; set; ;
0. p%blic *irt%al !o%ble BaseFe%re : get; set; ;
2. p%blic *irt%al !o%ble $ntretienGo%r : get; set; ;
13. p%blic *irt%al !o%ble &epasGo%r : get; set; ;
11. p%blic *irt%al !o%ble In!enitesCp : get; set; ;
12.
13. )) constr%cte%rs
1+. p%blic In!enites() :
1-. ;
1..
1/. )) i!entit,
10. p%blic o*erri!e string ToString() :
12. ret%rn string.7orat(1Q:3;U:1;U:2;U:3;U:+;R14 In!ice4 BaseFe%re4 $ntretienGo%r4 &epasGo%r4
In!enitesCp);
23. ;
21.
22. ;
23. ;
?e fichier de mapping table EindemnitesF S--T classe EIndemnitesF pourrait Jtre le suivant 9Indemnites.hbm.<ml; "
1. HIxl *ersion=11.31 enco!ing=1%t6J01 IK
2. H9ibernateJapping xlns=1%rnCn9ibernateJappingJ2.21
3. naespace=1#a'FibernateDeos1 assebl"=1paJn9ibernateJ!eos1K
+. Hclass nae=1In!enites1 table=1I'D$='IT$S1K
-. Hi! nae=1I!1 col%n=1ID1 %nsa*e!J*al%e=131K
.. Hgenerator class=1nati*e1 )K
/. H)i!K
0. H*ersion nae=1<ersion1 col%n=1<$&SIO'1)K
2. Hpropert" nae=1In!ice1 col%n=1I'DIC$1 %niM%e=1tr%e1)K
13. Hpropert" nae=1BaseFe%re1 col%n=1B>S$?F$@&$1 )K
11. Hpropert" nae=1$ntretienGo%r1 col%n=1$'T&$TI$'?GO@&1 )K
12. Hpropert" nae=1&epasGo%r1 col%n=1&$#>S?GO@&1 )K
13. Hpropert" nae=1In!enitesCp1 col%n=1I'D$='IT$S?C#1 )K
1+. H)classK
1-. H)9ibernateJappingK
7n ne trouve l( rien de neuf vis ( vis du fichier de mapping e<pli+u prcdemment. ?a seule diffrence se trouve ligne 2. ?*attribut
uni+ueLXtrueX indi+ue +u*il H a dans la table EindemnitesF une contrainte d*unicit sur la colonne EINCI'EF " il ne peut pas H avoir
deu< lignes avec la mJme valeur pour la colonne EINCI'EF.
#.1.2.1 8apping de la table .employes/
'onsidrons la table EemploHesF "
?a nouveaut vis ( vis des tables prcdentes est la prsence d*une cl tr!n"<re " la colonne EINCE1NITEOICF est une cl
trang.re sur la colonne EICF de la table EINCE1NITE=F. 'e champ rfrence la ligne de la table EINCE1NITE=F ( utiliser pour
calculer les indemnites de l*emploH.
?a classe EEmploHeF image de la table EemploHesF pourrait Jtre la suivante "
http"##tahe.developpe$.com
!I#%&
ID
cl primaire de tHpe autoincrement
<$&SIO'
nN de version de l*enregistrement
#&$'O=
prnom de l*emploH
'O=
son nom
>D&$SS$
son adresse
C#
son code postal
<I55$
sa ville
I'D$='IT$?ID
cl trang.re sur INCE1NITE=9IC;
1. naespace #a'FibernateDeos :
2. p%blic class $plo"e :
3. )) propri,t,s a%toatiM%es
+. p%blic *irt%al int I! : get; set; ;
-. p%blic *irt%al int <ersion : get; set; ;
.. p%blic *irt%al string SS : get; set; ;
/. p%blic *irt%al string 'o : get; set; ;
0. p%blic *irt%al string #reno : get; set; ;
2. p%blic *irt%al string >!resse : get; set; ;
13. p%blic *irt%al string <ille : get; set; ;
11. p%blic *irt%al string Co!e#ostal : get; set; ;
12. p%blic *irt%al In!enites In!enites : get; set; ;
13.
1+. )) constr%cte%rs
1-. p%blic $plo"e() :
1.. ;
1/.
10. )) ToString
12. p%blic o*erri!e string ToString() :
23. ret%rn string.7orat(1Q:3;U:1;U:2;U:3;U:+;U:-;U:.;R14 SS4 'o4 #reno4 >!resse4 <ille4
Co!e#ostal4 In!enites);
21. ;
22. ;
23. ;
?e fichier de mapping EEmploHe.hbm.<mlF pourrait Jtre le suivant "
1. HIxl *ersion=11.31 enco!ing=1%t6J01 IK
2. H9ibernateJapping xlns=1%rnCn9ibernateJappingJ2.21
3. naespace=1#a'FibernateDeos1 assebl"=1paJn9ibernateJ!eos1K
+. Hclass nae=1$plo"e1 table=1$=#5OD$S1K
-. Hi! nae=1I!1 col%n=1ID1 %nsa*e!J*al%e=131K
.. Hgenerator class=1nati*e1 )K
/. H)i!K
0. H*ersion nae=1<ersion1 col%n=1<$&SIO'1)K
2. Hpropert" nae=1SS1 col%n=1SS1)K
13. Hpropert" nae=1'o1 col%n=1'O=1)K
11. Hpropert" nae=1#reno1 col%n=1#&$'O=1)K
12. Hpropert" nae=1>!resse1 col%n=1>D&$SS$1)K
13. Hpropert" nae=1<ille1 col%n=1<I55$1)K
1+. Hpropert" nae=1Co!e#ostal1 col%n=1C#1)K
1-. Han"JtoJone nae=1In!enites1 col%n=1I'D$='IT$?ID1 casca!e=1sa*eJ%p!ate1 laV"=16alse1)K
1.. H)classK
1/. H)9ibernateJappingK
?a nouveaut rside ligne !& avec l*apparition d*une nouvelle balise " :/!n1-to-one;. 'ette balise sert ( mapper une colonne cl
trang.re EINCE1NITEOICF de la table EE1-?7[E=F vers la proprit EIndemnitesF de la classe EEmploHeF "
1. naespace #a'FibernateDeos :
2. p%blic class $plo"e :
3. )) propri,t,s a%toatiM%es
+. ..
-. p%blic *irt%al In!enites In!enites : get; set; ;
..
/. ...
0. ;
2. ;
?a table EE1-?7[E=F a une cl trang.re EINCE1NITEOICF +ui rfrence la colonne EICF de la table EINCE1NITE=F.
-lusieurs 9manH; lignes de la table EE1-?7[E=F peuvent rfrencer une mJme ligne 9one; de la table EINCE1NITE=F. C*oW le
nom de la balise SmanH-to-oneT. 'ette balise a ici les attributs suivants "
colu/n " indi+ue le nom de la colonne de la table EE1-?7[E=F +ui est cl trang.re sur la table EINCE1NITE=F
n!/e " indi+ue la proprit de la classe EEmploHeF associe ( cette colonne. ?e tHpe de cette proprit est ncessairement
la classe associe ( la table cible de la cl trang.re, ici la table EINCE1NITE=F. 7n sait +ue cette classe est la classe
EIndemnitesF d:( dcrite. '*est ce +ue refl.te la ligne & ci-dessus. 'ela signifie +ue lors+ue N)ibernate ram.nera de la base
un ob:et EEmploHeF, il ram.nera galement l*ob:et EIndemnitesF +ui va avec.
c!sc!de " cet attribut peut avoir diverses valeurs "
sa4e9update " une opration d*insertion 9save; ou de mise ( :our 9update; sur l*ob:et EEmploHeF doit Jtre propage
sur l*ob:et EIndemnitesF +u*il contient.
delete " la suppression d*un ob:et EEmploHeF doit Jtre propage ( l*ob:et EIndemnitesF +u*il contient.
http"##tahe.developpe$.com
!3#%&
all " propage les oprations d*insertion 9save;, de mise ( :our 9update; et de suppression 9delete;.
none " ne propage rien
-our terminer, rappelons la configuration de N)ibernate dans le fichier E/pp.configF "
1. HLJJ con6ig%ration 'Fibernate JJK
2. H9ibernateJcon6ig%ration xlns=1%rnCn9ibernateJcon6ig%rationJ2.21K
3. HsessionJ6actor"K
+. Hpropert" nae=1connection.pro*i!er1K'Fibernate.Connection.Dri*erConnection#ro*i!erH)propert"K
-. HLJJ
.. Hpropert" nae=1connection.!ri*er?class1K'Fibernate.Dri*er.="SMlDataDri*erH)propert"K
/. JJK
0. Hpropert" nae=1!ialect1K'Fibernate.Dialect.="S(5-DialectH)propert"K
2. Hpropert" nae=1connection.connection?string1K
13. Ser*er=local9ost;Database=!bpa?n9ibernate;@i!=root;#w!=;
11. H)propert"K
12. Hpropert" nae=1s9ow?sMl1K6alseH)propert"K
13. Happing assebl"=1paJn9ibernateJ!eos1)K
1+. H)sessionJ6actor"K
1-. H)9ibernateJcon6ig%rationK
?a ligne !5 indi+ue +ue les fichiers de mapping =)*+/)4/l seront trouvs dans l*assemblH Epam-nhibernate-demosF. 'eci n*est pas
fait par dfaut. Il faut le configurer dans le pro:et 'R "
en E!F, on slectionne les proprits d*un fichier de mapping
en E2F, l*action de gnration doit Jtre E8essource incorporeF E5F. 'ela signifie +u*( la gnration du pro:et, le fichier de
mapping doit Jtre incorpor dans l*assemblH gnr.
1), l'API de NHi+ern!te
8evenons ( l*architecture de notre pro:et e<emple "
Cans les paragraphes prcdents, nous avons configur N)ibernate de deu< faKons "
dans E/pp.configF, nous avons configur la conne<ion ( la base de donnes
nous avons crit pour cha+ue table de la base, la classe image de cette table et le fichier de mapping +ui permet de passer
de la classe ( la table et vice-versa.
Il nous reste ( dcouvrir les mthodes offertes par N)ibernate pour manipuler les donnes de la base " insertion, mise ( :our,
suppression, liste.
http"##tahe.developpe$.com
!4#%&
3
2
1
1
B.
-rogramme
console
'onnecteur
EA.O)NETF
S5B.
M1S9
Pramework
ENHi+ern!teF
1),)1 'o+8et Session>!ctor1
Toute opration N)ibernate se fait ( l*intrieur d*une session. 6ne s+uence tHpi+ue d*oprations N)ibernate est la suivante "
ouvrir une session N)ibernate
commencer une transaction dans la session
faire des oprations de persistance avec la session 9?oad, Aet, Pind, 'reate>uerH, =ave, =ave7r6pdate, Celete;
valider 9commit; ou invalider 9rollback; la transaction
fermer la session N)ibernate
6ne session est obtenue aupr.s d*une factorH de tHpe E=essionPactorHF. 'ette factorH est celle configure par la balise Ssession-
factorHT dans le fichier de configuration E/pp.configF "
1. HLJJ con6ig%ration 'Fibernate JJK
2. H9ibernateJcon6ig%ration xlns=1%rnCn9ibernateJcon6ig%rationJ2.21K
3. HsessionJ6actor"K
+. Hpropert" nae=1connection.pro*i!er1K'Fibernate.Connection.Dri*erConnection#ro*i!erH)propert"K
-. HLJJ
.. Hpropert" nae=1connection.!ri*er?class1K'Fibernate.Dri*er.="SMlDataDri*erH)propert"K
/. JJK
0. Hpropert" nae=1!ialect1K'Fibernate.Dialect.="S(5-DialectH)propert"K
2. Hpropert" nae=1connection.connection?string1K
13. Ser*er=local9ost;Database=!bpa?n9ibernate;@i!=root;#w!=;
11. H)propert"K
12. Hpropert" nae=1s9ow?sMl1K6alseH)propert"K
13. Happing assebl"=1paJn9ibernateJ!eos1)K
1+. H)sessionJ6actor"K
1-. H)9ibernateJcon6ig%rationK
Cans un code 'R, la =essionPactorH peut Jtre obtenue de la faKon suivante "
ISession7actor" session7actor" = new Con6ig%ration().Con6ig%re().B%il!Session7actor"();
?a classe #on0i"ur!tion est une classe du framework N)ibernate. ?*instruction prcdente e<ploite la section de configuration de
N)ibernate dans E/pp.configF. ?*ob:et EI=essionPactorHF obtenu a alors les "
informations pour crer une conne<ion ( la base de donnes cible
fichiers de mapping entre tables de la base de donnes et classes persistantes manipules par N)ibernate.
1),)% ! session NHi+ern!te
6ne fois la SessionFactory cre 9cela se fait une uni+ue fois;, on peut en obtenir les sessions permettant de faire des oprations de
persistance N)ibernate. 6n code usuel est le suivant "
1. tr":
2. )) o%*ert%re session
3. %sing (ISession session = session7actor".OpenSession())
+. :
-. )) !,b%t transaction
.. %sing (ITransaction transaction = session.BeginTransaction())
/. :
0. ........................ op,rations !e persistance
2. )) *ali!ation !e la transaction
13. transaction.Coit();
11. ;
12. ;
13. ;catc9 ($xception ex):
1+. ....
1-. ;
ligne 5 " une session est cre ( partir de la SessionFactory ( l*intrieur d*une clause usin". / la sortie de la clause using, la
session sera automati+uement ferme. =ans la clause using, il faudrait fermer la session e<plicitement 9session.Close)*;.
ligne I " les oprations de persistance vont se faire ( l*intrieur d*une transaction. =oit elles russissent toutes, soit aucune
ne russit. / l*intrieur de la clause using( la transaction est valide par un Commit 9ligne !;. =i dans la transaction, une
opration de persistance lance une e<ception, la transaction sera automati+uement invalide par un &ollback ( la sortie du
using.
le trH # catch des lignes ! et !5 permet d*intercepter une ventuelle e<ception lance par le code ( l*intrieur du trH
9session, transaction, persistance;.
http"##tahe.developpe$.com
!2#%&
1),)3 'inter0!ce ISession
Nous prsentons maintenant certaines des mthodes de l*interface ISession implmente par une session N)ibernate "
ITransaction BeginTransaction()
dmarre une transaction dans la session
ITransaction tx!session.BeginTransaction)*6
*oi! Clear()
vide la session. ?es ob:ets +u*elle contenait deviennent dtachs.
session.Clear)*6
*oi! Close()
ferme la session. ?es ob:ets +u*elle contenait sont sHnchroniss avec la base de
donnes. 'ette opration de sHnchronisation est galement faite ( la fin d*une
transaction. 'e dernier cas est le plus courant.
session.Close)*6
I(%er" Create(%er"(string M%er"String)
cre une re+uJte )>? 9)ibernate >uerH ?anguage; pour une e<cution
ultrieure.
I:uery ;uery!session.create:uery)<select e +rom Employe e*6
*oi! Delete(obWect obW)
supprime un ob:et. 'elui-ci peut appartenir ( la session 9attach; ou non
9dtach;. ?ors de la sHnchronisation de la session avec la base de donnes, une
opration =>? CE?ETE sera faite sur cet ob:et.
== on charge un employ> de la BD
Employe e!session.,et?Employe@)#31*6
== on le supprime
session.Delete)e*6
*oi! 7l%s9()
force la sHnchronisation de la session avec la base de donnes. ?e contenu de la
session ne change pas.
session.Flush)*6
T 8etHTK(obWect i!)
va chercher dans la base l*ob:et T de cl primaire id. =i cet ob:et n*e<iste pas,
rend le pointeur null.
== on charge un employ> de la BD
Employe e!session.,et?Employe@)#31*6
obWect Sa*e(obWect obW)
met l*ob:et o+8 dans la session. 'et ob:et n*a pas de cl primaire avant le Sa4e.
/pr.s le Sa4e, il en a une. ?ors de la sHnchronisation de la session, une opration
=>? IN=E8T sera faite sur la base.
== on cr>e un employ>
Employe e!ne$ Employe)*A...B6
== on le sau4egarde
e!session.Sa4e)e*6
Sa*eOr@p!ate(obWect obW)
fait une opration Sa4e si o+8 n*a pas de cl primaire ou une opration 'pdate s*il
en a d:( une.
*oi! @p!ate(obWect obW)
met ( :our dans la base de donnes, l*ob:et o+8. 6ne opration =>? 6-C/TE
est alors faite sur la base.
== on charge un employ> de la BD
Employe e!session.,et?Employe@)#31*6
== on change son nom
e.-om!...6
http"##tahe.developpe$.com
2#%&
== on le met C 5our dans la base
session.'pdate)e*6
1),), 'inter0!ce I9uer1
?*interface I9uer1 permet de re+uJter la base de donnes pour en e<traire des donnes. Nous avons vu comment en crer une
instance "
I:uery ;uery!session.create:uery)<select e +rom Employe e*6
?e param.tre de la mthode create:uery est une re+uJte )>? 9)ibernate >uerH ?anguage;, un langage analogue au langage =>?
mais re+uJtant des classes plutGt +ue des tables. ?a re+uJte ci-dessus demande la liste de tous les emploHs. Doici +uel+ues
e<emples de re+uJtes )>? "
select e +rom Employe e $here e.-om like DEFD
select e +rom Employe order by e.-om asc
select e +rom Employe e $here e.Indemnites.Indice!2
Nous prsentons maintenant certaines des mthodes de l*interface I9uer1 "
I5istHTK 5istHTK()
rend le rsultat de la re+uJte sous la forme d*une liste d*ob:ets T
IGist?Employe@ employes!session.create:uery)<select e +rom Employe e order by e.-om asc<*.Gist?Employe@)*6
I5ist 5ist()
rend le rsultat de la re+uJte sous la forme d*une liste oW cha+ue lment de la liste reprsente une ligne
rsultat du Select sous la forme d*un tableau d*ob:ets.
IGist lignes!session.create:uery)<select e.-om( e.Prenom( e.SS +rom Employe e<*.Gist)*6
lignes.i/.5/ reprsente la colonne : de la ligne i dans un tHpe o+8ect. /insi lignesE!FE!F est un tHpe o+8ect
reprsentant le prnom d*une personne. Ces transtHpages sont en gnral ncessaires pour rcuprer les
donnes dans leur tHpe e<act.
T @niM%e&es%ltHTK()
rend le premier ob:et du rsultat de la re+uJte
Employe e!session.create:uery)<select e +rom Employe e $here e.-om!D8E&TI-D<*.'ni;ue&esult?Employe@)*6
6ne re+uJte )>? peut Jtre (!r!/tre "
1. string n%Sec%;
2. ...
3. Employe e=session.createQuery("select e from Employe e where
e.SS=:num").SetString("num",numSecu).Uniue!esult"Employe#()$
Cans la re+uJte )>? de la ligne 5, Hnum est un param.tre +ui doit recevoir une valeur avant +ue la re+uJte ne soit e<cute. 'i-
dessus, c*est la mthode =etString +ui est utilise pour cela. ?*interface I:uery dispose de diverses mthodes Set pour affecter une
valeur ( un param.tre "
- SetBoole!n9string name, bool value;
- SetSin"le9string name, single value;
- Set.ou+le9string name, double value;
- SetInt3%9string name, int52 value;
..
1)- 9uelques e4e/(les de code
?es e<emples +ui suivent s*appuient sur l*architecture tudie prcdemment et rappele ci-dessous. ?a base de donnes est la base
de donnes 1H=>? EdbpamOnhibernateF galement prsente. ?es e<emples sont des programmes console E!F utilisant le
framework N)ibernate E5F pour manipuler la base de donnes E2F.
http"##tahe.developpe$.com
2!#%&
?e pro:et 'R dans le+uel s*ins.rent les e<emples +ui vont suivre est celui d:( prsent "
en E!F, les C?? dont a besoin le pro:et "
EN)ibernateF " la C?? du framework N)ibernate
E1H=+l.CataF " la C?? du connecteur /C7.NET du =ABC 1H=>? &
Elog%netF " la C?? d*un outil permettant de gnrer des logs
en E2F, les classes images des tables de la base de donnes
en E5F, le fichier E/pp.configF +ui configure l*application tout enti.re, dont le framework EN)ibernateF
en E%F, des applications console de test. 'e sont celles-ci +ue nous allons prsenter partiellement.
1)-)1 O+tenir le contenu de l! +!se
?e programme E=howCataBase.csF permet d*afficher le contenu de la base "
1. %sing S"ste;
2. %sing S"ste.Collections;
3. %sing S"ste.Collections.8eneric;
+. %sing 'Fibernate;
-. %sing 'Fibernate.C6g;
..
/.
0. naespace #a'FibernateDeos
2. :
13. p%blic class S9owDataBase
11. :
12.
13. pri*ate static ISession7actor" session7actor" = n%ll;
1+.
1-. )) prograe principal
1.. static *oi! =ain(stringQR args)
1/. :
10. )) initialisation 6actor" 'Fibernate
12. session7actor" = new Con6ig%ration().Con6ig%re().B%il!Session7actor"();
23. tr"
21. :
22. )) a66ic9age conten% !e la base
23. Console.Trite5ine(1>66ic9age base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ1);
2+. S9owDataBase1();
2-. ;
2.. catc9 ($xception ex)
http"##tahe.developpe$.com
22#%&
1 4
3
2
-rogramme
console
1
Pramework
ENHi+ern!teF
B.
'onnecteur
EA.O)NETF
2
S5B.
M1S9
3
2/. :
20. )) on a66ic9e lNexception
22. Console.Trite5ine(string.7orat(15Nerre%r s%i*ante sNest pro!%ite C Q:3;R14
ex.ToString()));
33. ;
31. 6inall"
32. :
33. i6 (session7actor" L= n%ll)
3+. :
3-. session7actor".Close();
3.. ;
3/. ;
30. )) attente cla*ier
32. Console.&ea!5ine();
+3. ;
+1.
+2. )) test1
+3. static *oi! S9owDataBase1()
++. :
+-. )) o%*ert%re session
+.. %sing (ISession session = session7actor".OpenSession())
+/. :
+0. )) !,b%t transaction
+2. %sing (ITransaction transaction = session.BeginTransaction())
-3. :
-1. )) on r,c%pXre la liste !es eplo",s
-2. I5istH$plo"eK eplo"es = session.Create(%er"(Y1select e 6ro $plo"e e or!er b" e.'o
asc1).5istH$plo"eK();
-3. )) on lNa66ic9e
-+. Console.Trite5ine(1JJJJJJJJJJJJJJJ liste !es eplo",s1);
--. 6oreac9 ($plo"e e in eplo"es)
-.. :
-/. Console.Trite5ine(e);
-0. ;
-2. )) on r,c%pXre la liste !es in!enites
.3. I5istHIn!enitesK in!enites = session.Create(%er"(Y1select i 6ro In!enites i or!er b"
i.In!ice asc1).5istHIn!enitesK();
.1. )) on lNa66ic9e
.2. Console.Trite5ine(1JJJJJJJJJJJJJJJ liste !es in!enit,s1);
.3. 6oreac9 (In!enites i in in!enites)
.+. :
.-. Console.Trite5ine(i);
... ;
./. )) on r,c%pXre la liste !es cotisations
.0. Cotisations cotisations = session.Create(%er"(Y1select c 6ro Cotisations
c1).@niM%e&es%ltHCotisationsK();
.2. Console.Trite5ine(1JJJJJJJJJJJJJJJ tablea% !es ta%x !e cotisations1);
/3. Console.Trite5ine(cotisations);
/1. )) coit transaction
/2. transaction.Coit();
/3. ;
/+. ;
/-. ;
/.. ;
//. ;
E4(lic!tions "
ligne !2 " l*ob:et SessionFactory est cr. '*est lui +ui va nous permettre d*obtenir des ob:ets Session.
ligne 2% " on affiche le contenu de la base
lignes 5!-53 " la SessionFactory est ferme dans la clause +inally du try.
ligne %5 " la mthode +ui affiche le contenu de la base
ligne %I " on obtient une Session aupr.s de la SessionFactory.
ligne %2 " on dmarre une transaction
ligne &2 " re+uJte )>? pour rcuprer la liste des emploHs. / cause de la cl trang.re +ui lie l*entit Employe ( l*entit
Indemnite, avec cha+ue emloH, on aura son indemnit.
ligne I " re+uJte )>? pour obtenir la liste des indemnits.
ligne I4 " re+uJte )>? pour obtenir l*uni+ue ligne de la table des cotisations.
ligne 32 " fin de la transaction
ligne 35 " fin du using Itransaction de la ligne %2 \ la transaction est automati+uement ferme
ligne 3% " fin du using Isession de la ligne %I \ la session est automati+uement ferme.
A00ic*!"e cr!n o+tenu "
http"##tahe.developpe$.com
25#%&
1. >66ic9age base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
2. JJJJJJJJJJJJJJJ liste !es eplo",s
3. Q2-+13+2+3+2.3-0UGo%*einalU=arieU- r%e !es oisea%xUSt CorentinU+2233UQ1U1423U2U3U12RR
+. Q2.312++32111/+2U5a*ertiUG%stineU5a BrZlerieUSt =arcelU+231+UQ2U241U241U341U1-RR
-.
.. JJJJJJJJJJJJJJJ liste !es in!enit,s
/. Q1U1423U2U3U12R
0. Q2U241U241U341U1-R
2. JJJJJJJJJJJJJJJ tablea% !es ta%x !e cotisations
13. Q34+2U.41-U2432U/400R
7n notera lignes 5 et % +u*en demandant un emploH, on a galement obtenu son indemnit.
1)-)% Insrer des donnes d!ns l! +!se
?e programme EPillCataBase.csF permet d*insrer des donnes dans la base "
1. %sing S"ste;
2. %sing S"ste.Collections;
3. %sing S"ste.Collections.8eneric;
+. %sing 'Fibernate;
-. %sing 'Fibernate.C6g;
..
/.
0. naespace #a'FibernateDeos
2. :
13. p%blic class 7illDataBase
11. :
12.
13. pri*ate static ISession7actor" session7actor" = n%ll;
1+.
1-. )) prograe principal
1.. static *oi! =ain(stringQR args)
1/. :
10. )) initialisation 6actor" 'Fibernate
12. session7actor" = new Con6ig%ration().Con6ig%re().B%il!Session7actor"();
23. tr"
21. :
22. )) s%ppression !% conten% !e la base
23. Console.Trite5ine(1$66aceent base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ1);
2+. ClearDataBase1();
2-. Console.Trite5ine(1>66ic9age base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ1);
2.. S9owDataBase();
2/. Console.Trite5ine(1&eplissage base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ1);
20. 7illDataBase1();
22. Console.Trite5ine(1>66ic9age base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ1);
33. S9owDataBase();
31. ;
32. catc9 ($xception ex)
33. :
3+. )) on a66ic9e lNexception
3-. Console.Trite5ine(string.7orat(15Nerre%r s%i*ante sNest pro!%ite C Q:3;R14
ex.ToString()));
3.. ;
3/. 6inall"
30. :
32. i6 (session7actor" L= n%ll)
+3. :
+1. session7actor".Close();
+2. ;
+3. ;
++. )) attente cla*ier
+-. Console.&ea!5ine();
+.. ;
+/.
+0. )) test1
+2. static *oi! S9owDataBase()
-3. :
-1. )) *oir exeple pr,c,!ent
-2. ;
-3.
-+. )) ClearDataBase1
--. static *oi! ClearDataBase1()
-.. :
-/. )) o%*ert%re session
http"##tahe.developpe$.com
2%#%&
-0. %sing (ISession session = session7actor".OpenSession())
-2. :
.3. )) !,b%t transaction
.1. %sing (ITransaction transaction = session.BeginTransaction())
.2. :
.3. )) on r,c%pXre la liste !es eplo",s
.+. I5istH$plo"eK eplo"es = session.Create(%er"(Y1select e 6ro $plo"e
e1).5istH$plo"eK();
.-. )) on s%pprie to%s les eplo",s
... Console.Trite5ine(1JJJJJJJJJJJJJJJ s%ppression !es eplo",s associ,s1);
./. 6oreac9 ($plo"e e in eplo"es)
.0. :
.2. session.Delete(e);
/3. ;
/1. )) on r,c%pXre la liste !es in!enit,s
/2. I5istHIn!enitesK in!enites = session.Create(%er"(Y1select i 6ro In!enites
i1).5istHIn!enitesK();
/3. )) on s%pprie les in!enit,s
/+. Console.Trite5ine(1JJJJJJJJJJJJJJJ s%ppression !es in!enit,s1);
/-. 6oreac9 (In!enites i in in!enites)
/.. :
//. session.Delete(i);
/0. ;
/2. )) on r,c%pXre la liste !es cotisations
03. Cotisations cotisations = session.Create(%er"(Y1select c 6ro Cotisations
c1).@niM%e&es%ltHCotisationsK();
01. Console.Trite5ine(1JJJJJJJJJJJJJJJ s%ppression !es ta%x !e cotisations1);
02. i6 (cotisations L= n%ll)
03. :
0+. session.Delete(cotisations);
0-. ;
0.. )) coit transaction
0/. transaction.Coit();
00. ;
02. ;
23. ;
21.
22. )) 7illDataBase
23. static *oi! 7illDataBase1()
2+. :
2-. )) o%*ert%re session
2.. %sing (ISession session = session7actor".OpenSession())
2/. :
20. )) !,b%t transaction
22. %sing (ITransaction transaction = session.BeginTransaction())
133. :
131. )) on cr,e !e%x in!enit,s
132. In!enites i1 = new In!enites() : I! = 34 In!ice = 14 BaseFe%re = 1.234
$ntretienGo%r = 24 &epasGo%r = 34 In!enitesCp = 12 ;;
133. In!enites i2 = new In!enites() : I! = 34 In!ice = 24 BaseFe%re = 2.14 $ntretienGo%r
= 2.14 &epasGo%r = 3.14 In!enitesCp = 1- ;;
13+. )) on cr,e !e%x eplo",s
13-. $plo"e e1 = new $plo"e() : I! = 34 SS = 12-+13+2+3+2.3-014 'o = 1Go%*einal14
#reno = 1=arie14 >!resse = 1- r%e !es oisea%x14 <ille = 1St Corentin14 Co!e#ostal = 1+223314
In!enites = i1 ;;
13.. $plo"e e2 = new $plo"e() : I! = 34 SS = 12.312++32111/+214 'o = 15a*erti14 #reno
= 1G%stine14 >!resse = 15a BrZlerie14 <ille = 1St =arcel14 Co!e#ostal = 1+231+14 In!enites =
i2 ;;
13/. )) on cr,e les ta%x !e cotisations
130. Cotisations cotisations = new Cotisations() : I! = 34 Csg&!s = 3.+24 Csg! = ..1-4
Sec% = 2.324 &etraite = /.00 ;;
132. )) on sa%*egar!e le to%t
113. session.Sa*e(e1);
111. session.Sa*e(e2);
112. session.Sa*e(cotisations);
113. )) coit transaction
11+. transaction.Coit();
11-. ;
11.. ;
11/. ;
110.
112. ;
123. ;
E4(lic!tions
ligne !2 " la SessionFactory est cre
http"##tahe.developpe$.com
2&#%&
lignes 53-%5 " elle est ferme dans la clause +inally du try
ligne && " la mthode ClearDataBase# +ui vide la base de donnes. ?e principe est le suivant "
on rcup.re tous les emploHs 9ligne I%; dans une liste
on les supprime un ( un 9lignes I3-3;
ligne 25 " la mthode FillDataBase# ins.re +uel+ues donnes dans la base de donnes
on cre deu< entits Indemnites 9lignes !2, !5;
on cre deu< emploHs aHant ces indemnits 9lignes !&, !I;
on cre un ob:et Cotisations en ligne !4.
lignes !!, !!! " les deu< entits EmploHe sont persists dans la base de donnes
ligne !!2 " l*entit 'otisations est persist ( son tour
on peut s*tonner +ue les entits Indemnit>s des lignes !2 et !5 n*aient pas t persistes. En fait elle l*ont t en mJme
temps +ue les entits Employe. -our le comprendre, il fait revenir au mapping de l*entit Employe "
1. HIxl *ersion=11.31 enco!ing=1%t6J01 IK
2. H9ibernateJapping xlns=1%rnCn9ibernateJappingJ2.21
3. naespace=1#a'FibernateDeos1 assebl"=1paJn9ibernateJ!eos1K
+. Hclass nae=1$plo"e1 table=1$=#5OD$S1K
-. Hi! nae=1I!1 col%n=1ID1 %nsa*e!J*al%e=131K
.. Hgenerator class=1nati*e1 )K
/. H)i!K
0. H*ersion nae=1<ersion1 col%n=1<$&SIO'1)K
2. Hpropert" nae=1SS1 col%n=1SS1)K
13. Hpropert" nae=1'o1 col%n=1'O=1)K
11. Hpropert" nae=1#reno1 col%n=1#&$'O=1)K
12. Hpropert" nae=1>!resse1 col%n=1>D&$SS$1)K
13. Hpropert" nae=1<ille1 col%n=1<I55$1)K
1+. Hpropert" nae=1Co!e#ostal1 col%n=1C#1)K
1-. Han"JtoJone nae=1In!enites1 col%n=1I'D$='IT$?ID1 casca!e=1sa*eJ%p!ate1 laV"=16alse1)K
1.. H)classK
1/. H)9ibernateJappingK
?a ligne !& +ui mappe la relation de cl trang.re +ui l*entit Employe ( l*entit Indemnites a l*attribut cascade! <sa4e9update <, ce +ui
entraine +ue les oprations X sa4e X et X update X de l*entit Employe sont propages ( l*entit Indemnites interne.
A00ic*!"e cr!n o+tenu "
$66aceent base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJJJJJ s%ppression !es eplo",s et !es in!enit,s associ,es
JJJJJJJJJJJJJJJ s%ppression !es in!enit,s restantes
JJJJJJJJJJJJJJJ s%ppression !es ta%x !e cotisations
>66ic9age base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJJJJJ liste !es eplo",s
JJJJJJJJJJJJJJJ liste !es in!enit,s
JJJJJJJJJJJJJJJ tablea% !es ta%x !e cotisations
&eplissage base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
>66ic9age base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJJJJJ liste !es eplo",s
Q2-+13+2+3+2.3-0UGo%*einalU=arieU- r%e !es oisea%xUSt CorentinU+2233UQ2U241U241U341U1-RR
Q2.312++32111/+2U5a*ertiUG%stineU5a BrZlerieUSt =arcelU+231+UQ1U1423U2U3U12RR
JJJJJJJJJJJJJJJ liste !es in!enit,s
Q1U1423U2U3U12R
Q2U241U241U341U1-R
JJJJJJJJJJJJJJJ tablea% !es ta%x !e cotisations
Q34+2U.41-U2432U/400R
1)-)3 Rec*erc*e d'un e/(lo1
?e programme E-rogram.csF a diverses mthodes illustrant l*acc.s et la manipulation des donnes de la base. Nous en prsentons
+uel+ues-unes.
?a mthode EPindEmploHeeF permet de trouver un emploH d*apr.s son nN de scurit sociale "
1. )) 7in!$plo"ee
2. static *oi! 7in!$plo"ee() :
3. tr" :
+. )) o%*ert%re session
http"##tahe.developpe$.com
2I#%&
-. %sing (ISession session = session7actor".OpenSession()) :
.. )) !,b%t transaction
/. %sing (ITransaction transaction = session.BeginTransaction()) :
0. )) on rec9erc9e %n eplo", [ partir !e son n\ SS
2. String n%Sec% = 12-+13+2+3+2.3-01;
13. I(%er" M%er" = session.Create(%er"(Y1select e 6ro $plo"e e w9ere e.SS=Cn%Sec%1);
11. $plo"e eplo"e = M%er".SetString(1n%Sec%14 n%Sec%).@niM%e&es%ltH$plo"eK();
12. i6 (eplo"e L= n%ll) :
13. Console.Trite5ine(1$plo"eQ1 ] n%Sec% ] 1R=1 ] eplo"e);
1+. ; else :
1-. Console.Trite5ine(1$plo"eQ1 ] n%Sec% ] 1R non tro%*,...1);
1.. ;
1/.
10. n%Sec% = 1xx1;
12. eplo"e = M%er".SetString(1n%Sec%14 n%Sec%).@niM%e&es%ltH$plo"eK();
23. i6 (eplo"e L= n%ll) :
21. Console.Trite5ine(1$plo"eQ1 ] n%Sec% ] 1R=1 ] eplo"e);
22. ; else :
23. Console.Trite5ine(1$plo"eQ1 ] n%Sec% ] 1R non tro%*,...1);
2+. ;
2-.
2.. )) coit transaction
2/. transaction.Coit();
20. ;
22. ;
33. ; catc9 ($xception e) :
31. Console.Trite5ine(15Nexception s%i*ante sNest pro!%ite C 1 ] e.=essage);
32. ;
33. ;
E4(lic!tions
ligne ! " la re+uJte =elect paramtre par numSecu ( e<cuter
ligne !! " l*affectation d*une valeur au param.tre numSecu et l*e<cution de la mthode 'ni;ue&esult pour avoir un seul
rsultat.
A00ic*!"e cr!n o+tenu "
&ec9erc9e !N%n eplo", JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
$plo"eQ2-+13+2+3+2.3-0R=Q2-+13+2+3+2.3-0UGo%*einalU=arieU- r%e !es oisea%xUSt CorentinU+2233UQ2U241U241U
341U1-RR
$plo"eQxxR non tro%*,...
1)-), Insertion d'entits in?!lides
?a mthode suivante tente de sauvegarder une entit EEmploHeF non initialise.
1. )) Sa*e$pt"$plo"ee
2. static *oi! Sa*e$pt"$plo"ee() :
3. tr" :
+. )) o%*ert%re session
-. %sing (ISession session = session7actor".OpenSession()) :
.. )) !,b%t transaction
/. %sing (ITransaction transaction = session.BeginTransaction()) :
0. )) on cr,e %n eplo"e *i!e
2. $plo"e e = new $plo"e();
13. )) on cr,e %ne in!enit, non existante
11. In!enites i = new In!enites() : I! = 34 In!ice = 34 BaseFe%re = 1.234 $ntretienGo%r
= 24 &epasGo%r = 34 In!enitesCp = 12 ;;
12. )) M%Non associe [ lNeplo",
13. e.In!enites = i;
1+. )) on sa%*egar!e lNeplo", en laissant *i!es les a%tres c9aps
1-. session.Sa*e(e);
1.. )) coit transaction
1/. transaction.Coit();
10. ;
12. ;
23. ; catc9 ($xception e) :
21. Console.Trite5ine(15Nexception s%i*ante sNest pro!%ite C 1 ] e.=essage);
22. ;
http"##tahe.developpe$.com
23#%&
23. ;
E4(lic!tions
8appelons le code de la classe EEmploHeF "
1. naespace #a'FibernateDeos :
2. p%blic class $plo"e :
3. )) propri,t,s a%toatiM%es
+. p%blic *irt%al int I! : get; set; ;
-. p%blic *irt%al int <ersion : get; set; ;
.. p%blic *irt%al string SS : get; set; ;
/. p%blic *irt%al string 'o : get; set; ;
0. p%blic *irt%al string #reno : get; set; ;
2. p%blic *irt%al string >!resse : get; set; ;
13. p%blic *irt%al string <ille : get; set; ;
11. p%blic *irt%al string Co!e#ostal : get; set; ;
12. p%blic *irt%al In!enites In!enites : get; set; ;
13.
1+. )) constr%cte%rs
1-. p%blic $plo"e() :
1.. ;
1/.
10. )) ToString
12. p%blic o*erri!e string ToString() :
23. ret%rn string.7orat(1Q:3;U:1;U:2;U:3;U:+;U:-;U:.;R14 SS4 'o4 #reno4 >!resse4 <ille4
Co!e#ostal4 In!enites);
21. ;
22. ;
23. ;
6n ob:et EEmploHeF non initialis, aura la valeur null pour tous ses champs de tHpe strin". ?ors de l*insertion de l*enregistrement
dans la table EemploHesF, N)ibernate laissera vides les colonnes correspondant ( ces champs. 7r dans la table EemploHesF, toutes les
colonnes ont l*attribut not null, ce +ui interdit les colonnes sans valeur. ?e pilote /C7.NET lancera alors une e<ception "
1. sa%*egar!e !N%n eplo", *i!e JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
2. 5Nexception s%i*ante sNest pro!%ite C co%l! not insertC Q#a'FibernateDeos.$plo"eRQS(5C I'S$&T
I'TO $=#5OD$S (<$&SIO'4 SS4 'O=4 #&$'O=4 >D&$SS$4 <I55$4 C#4 I'D$='IT$?ID) <>5@$S
(I4 I4 I4 I4 I4 I4 I4 I)R
1)-)- #r!tion de deu4 inde/nits de /@/e indice l'intrieur d'une tr!ns!ction
Cans la table EindemnitesF, la colonne EindiceF a t dclare avec l*attribut unique, ce +ui interdit d*avoir deu< lignes avec le mJme
indice. ?a mthode suivante cre deu< indemnits de mJme indice ( l*intrieur d*une transaction "
1. )) CreateIn!enites1
2. static *oi! CreateIn!enites1() :
3. tr" :
+. )) o%*ert%re session
-. %sing (ISession session = session7actor".OpenSession()) :
.. )) !,b%t transaction
/. %sing (ITransaction transaction = session.BeginTransaction()) :
0. )) on cr,e !e%x in!enit,s !e ^e in!ice
2. In!enites i1 = new In!enites() : I! = 34 In!ice = 14 BaseFe%re = 1.234 $ntretienGo%r
= 24 &epasGo%r = 34 In!enitesCp = 12 ;;
13. In!enites i2 = new In!enites() : I! = 34 In!ice = 14 BaseFe%re = 1.234 $ntretienGo%r
= 24 &epasGo%r = 34 In!enitesCp = 12 ;;
11. )) on les sa%*egar!e
12. session.Sa*e(i1);
13. session.Sa*e(i2);
1+. )) coit transaction
1-. transaction.Coit();
1.. ;
1/. ;
10. ; catc9 ($xception e) :
12. Console.Trite5ine(15Nexception s%i*ante sNest pro!%ite C 1 ] e.=essage);
23. ;
21. ;
E4(lic!tions
http"##tahe.developpe$.com
24#%&
lignes 2 et !, on cre deu< entits Indemnites aHant le mJme indice. 7r dans la base de donnes, la colonne INCI'E a
l*attribut 6NI>6E.
les lignes !2 et !5 mettent les deu< entits Indemnites dans le conte<te de persistance. 'elui-ci est sHnchronis avec la base
de donnes lors de la validation de la transaction ligne !&. 'ette sHnchronisation va provo+uer deu< IN=E8T. ?e
deu<i.me va provo+uer une e<ception ( cause de l*unicit de la colonne INCI'E. -arce +u*on est ( l*intrieur d*une
transaction, le premier IN=E8T va Jtre dfait.
?e rsultat obtenu est le suivant "
1. $66aceent base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
2. JJJJJJJJJJJJJJJ s%ppression !es eplo",s
3. JJJJJJJJJJJJJJJ s%ppression !es in!enit,s
+. JJJJJJJJJJJJJJJ s%ppression !es ta%x !e cotisations
-. Cr,ation !e !e%x in!enit,s !e ^e in!ice !ans %ne transaction JJJJJJJJJJJJJJ
.. 5Nexception s%i*ante sNest pro!%ite C co%l! not insertC Q#a'FibernateDeos.In!enitesRQS(5C
I'S$&T I'TO I'D$='IT$S (<$&SIO'4 I'DIC$4 B>S$?F$@&$4 $'T&$TI$'?GO@&4 &$#>S?GO@&4 I'D$='IT$S?C#)
<>5@$S (I4 I4 I4 I4 I4 I)R
/. >66ic9age base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
0. JJJJJJJJJJJJJJJ liste !es eplo",s
2. JJJJJJJJJJJJJJJ liste !es in!enit,s
13. JJJJJJJJJJJJJJJ tablea% !es ta%x !e cotisations
?igne 2, on peut voir +ue la table EindemnitesF est vide. /ucune insertion n*a eu lieu.
1)-)A #r!tion de deu4 inde/nits de /@/e indice *ors tr!ns!ction
?a mthode suivante cre deu< indemnits de mJme indice sans utiliser de transaction "
1. )) CreateIn!enites2
2. static *oi! CreateIn!enites2() :
3. tr" :
+. )) o%*ert%re session
-. %sing (ISession session = session7actor".OpenSession()) :
..
/. )) on cr,e !e%x in!enit,s !e ^e in!ice
0. In!enites i1 = new In!enites() : I! = 34 In!ice = 14 BaseFe%re = 1.234 $ntretienGo%r =
24 &epasGo%r = 34 In!enitesCp = 12 ;;
2. In!enites i2 = new In!enites() : I! = 34 In!ice = 14 BaseFe%re = 1.2+4 $ntretienGo%r =
24 &epasGo%r = 34 In!enitesCp = 12 ;;
13. )) on les sa%*egar!e
11. session.Sa*e(i1);
12. session.Sa*e(i2);
13. ;
1+. ; catc9 ($xception e) :
1-. Console.Trite5ine(15Nexception s%i*ante sNest pro!%ite C 1 ] e.=essage);
1.. ;
1/. ;
E4(lic!tions
on a le mJme code +ue prcdemment mais sans transaction.
la sHnchronisation du conte<te de persistance avec la base de donnes sera fait ( la fermeture de ce conte<te, ligne !5
9fermeture de la Session;. ?a sHnchronisation va provo+uer deu< IN=E8T. ?e deu<i.me va chouer ( cause de l*unicit de
la colonne INCI'E. 1ais comme on n*est pas dans une transaction, le premier IN=E8T ne sera pas dfait.
?e rsultat obtenu est le suivant "
1. Cr,ation !e !e%x in!enit,s !e ^e in!ice sans transaction JJJJJJJJJJJJJJ
2. 5Nexception s%i*ante sNest pro!%ite C co%l! not insertC Q#a'FibernateDeos.In!enitesRQS(5C
I'S$&T I'TO I'D$='IT$S (<$&SIO'4 I'DIC$4 B>S$?F$@&$4 $'T&$TI$'?GO@&4 &$#>S?GO@&4 I'D$='IT$S?C#)
<>5@$S (I4 I4 I4 I4 I4 I)R
3. >66ic9age base JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+. JJJJJJJJJJJJJJJ liste !es eplo",s
-. JJJJJJJJJJJJJJJ liste !es in!enit,s
.. Q1U1423U2U3U12R
/. JJJJJJJJJJJJJJJ tablea% !es ta%x !e cotisations
?a base tait vide avant l*e<cution de la mthode. ?igne I, on peut voir +ue la table EindemnitesF a une ligne.
http"##tahe.developpe$.com
22#%&
% Int"r!tion S(rin" B NHi+ern!te
?e framework S(rin" offre des classes utilitaires pour travailler avec le framework NHi+ern!te. ?*utilisation de ces classes rend le
code d*acc.s au< donnes d*un =ABC plus simple ( crire. 'onsidrons l*architecture multi-couches suivante "
Cans la suite, nous allons construire une couche EdaoF avec E=pring # N)ibernateF en commentant le code d*une solution
fonctionnelle. Nous ne chercherons pas ( donner toutes les possibilits de configuration ou d*utilisation du framework E=pring #
NhibernateF. ?e lecteur pourra adapter la solution propose ( ses propres probl.mes en s*aidant de la documentation de
=pring.NET Ehttp"##www.springframework.net#documentation.htmlF 9dcembre 2!!;.
%)1 ! couc*e 6d!o7 d'!cc<s !u4 donnes
?a base de donnes est la base 1H=>? EdbpamOnhibernateF d:( prsente page &. ?a couche EdaoF implmente l*interface 'R
suivante "
1. %sing #a.Dao.$ntites;
2.
3. naespace #a.Dao.Ser*ice :
+. p%blic inter6ace I#aDao :
-. )) liste !e to%tes les i!entit,s !es eplo",s
.. $plo"eQR 8et>llI!entites$plo"es();
/. )) %n eplo", partic%lier a*ec ses in!enit,s
0. $plo"e 8et$plo"e(string ss);
2. )) liste !e to%tes les cotisations
13. Cotisations 8etCotisations();
11. ;
12. ;
%)1)1 e (ro8et Cisu!l Studio #$ de l! couc*e 6d!o7
?e pro:et Disual =tudio de la couche EdaoF est le suivant "
http"##tahe.developpe$.com
5#%&
2
1
B.
'ouche d*acc.s
au< donnes
Ed!oF
'onnecteur
EA.O)NETF
S5B.
'ouche
E/etierF
'ouche
E(rsent!tionF
Pramework
ES(rin"#
NHi+ern!teF
=-8INA
2
1
B.
'ouche d*acc.s
au< donnes
Ed!oF
'onnecteur
EA.O)NETF
S5B.
'ouche
E/etierF
'ouche
E(rsent!tionF
Pramework
ES(rin"#
NHi+ern!teF
=-8INA
en E!F, le pro:et dans sa globalit
le dossier EpamF contient les classes du pro:et ainsi +ue la configuration des entits N)ibernate
les fichiers E/pp.configF et ECao.<mlF configurent le framework =pring # N)ibernate. Nous aurons ( dcrire le
contenu de ces deu< fichiers.
en E2F, les diffrentes classes du pro:et
dans le dossier EentitesF nous retrouvons les entits N)ibernate tudies dans le pro:et prcdent 9cf page !5;
dans le dossier EserviceF, nous trouvons l*interface EI-amCaoF et son implmentation avec le framework =pring #
N)ibernate E-amCao=pringN)ibernateF.
le dossier EtestsF contient les tests de l*interface EI-amCaoF.
en E5F, les rfrences du pro:et. ?*intgration =pring # N)ibernate ncessite de nouvelles Cll E%F.
Cans les rfrences E5F du pro:et, on trouve les C?? suivantes "
-Iibernate " pour l*781 N)ibernate
8yS;l.Data " le pilote /C7.NET du =ABC 1H=>? &
Spring.Core " pour le framework =pring +ui assure l*intgration des couches
log3net " une biblioth.+ue de logs
nunit.+rame$ork " une biblioth.+ue de tests unitaires
Spring.Eop( Spring.Data et Spring.Data.-Iibernate12 " assurent le support =pring # N)ibernate.
7n fera en sorte +ue toutes ces Cll aient leur proprit X Copie locale X ( True.
%)1)% ! con0i"ur!tion du (ro8et #$
?e pro:et est configur de la faKon suivante "
en E!F, le nom de l*assemblH du pro:et est Epam-dao-spring-nhibernateF. 'e nom intervient dans divers fichiers de
configuration du pro:et.
%)1)3 es entits de l! couc*e 6d!o7
http"##tahe.developpe$.com
5!#%&
2
1
3
1
4
?es entits 9ob:ets; ncessaires ( la couche EdaoF ont t rassembles dans le dossier EentitesF E!F du pro:et. 'es entits sont celles du
pro:et prcdent 9cf page !5; ( une diffrence pr.s +ue l*on trouve dans les fichiers de configuration N)ibernate. -renons par
e<emple, le fichier EEmploHe.hbm.<mlF "
en E2F, le fichier est configur pour Jtre incorpor dans l*assemblH du pro:et
=on contenu est le suivant "
1. HIxl *ersion=11.31 enco!ing=1%t6J01 IK
2. H9ibernateJapping xlns=1%rnCn9ibernateJappingJ2.21
3. naespace=1#a.Dao.$ntites1 assebl"=1paJ!aoJspringJn9ibernate1K
+. Hclass nae=1$plo"e1 table=1$=#5OD$S1K
-. Hi! nae=1I!1 col%n=1ID1K
.. Hgenerator class=1nati*e1 )K
/. H)i!K
0. H*ersion nae=1<ersion1 col%n=1<$&SIO'1)K
2. Hpropert" nae=1SS1 col%n=1SS1 lengt9=11-1 notJn%ll=1tr%e1 %niM%e=1tr%e1)K
13. Hpropert" nae=1'o1 col%n=1'O=1 lengt9=1331 notJn%ll=1tr%e1)K
11. Hpropert" nae=1#reno1 col%n=1#&$'O=1 lengt9=1231 notJn%ll=1tr%e1)K
12. Hpropert" nae=1>!resse1 col%n=1>D&$SS$1 lengt9=1-31 notJn%ll=1tr%e1 )K
13. Hpropert" nae=1<ille1 col%n=1<I55$1 lengt9=1331 notJn%ll=1tr%e1)K
1+. Hpropert" nae=1Co!e#ostal1 col%n=1C#1 lengt9=1-1 notJn%ll=1tr%e1)K
1-. Han"JtoJone nae=1In!enites1 col%n=1I'D$='IT$?ID1 casca!e=1all1 laV"=16alse1)K
1.. H)classK
1/. H)9ibernateJappingK
ligne 5 " l*attribut assemblH indi+ue +ue le fichier EEmploHe.hbm.<mlF sera trouv dans l*assemblH Epam-dao-spring-
nhibernateF
-ar ailleurs, dans le dossier EentitesF, nous trouvons une classe d*e<ception utilise par le pro:et "
1. %sing S"ste;
2. naespace #a.Dao.$ntites :
3.
+. p%blic class #a$xception C $xception :
-.
.. )) le co!e !e lNerre%r
/. p%blic int Co!e : get; set; ;
0.
2. )) constr%cte%rs
13. p%blic #a$xception() :
11. ;
12.
13. p%blic #a$xception(int Co!e)
1+. C base() :
1-. t9is.Co!e = Co!e;
1.. ;
1/.
10. p%blic #a$xception(string essage4 int Co!e)
12. C base(essage) :
23. t9is.Co!e = Co!e;
21. ;
22.
23. p%blic #a$xception(string essage4 $xception ex4 int Co!e)
2+. C base(essage4 ex) :
2-. t9is.Co!e = Co!e;
2.. ;
2/. ;
20. ;
http"##tahe.developpe$.com
52#%&
2 1
?a classe E-amE<ceptionF a t drive de la classe EE<ceptionF 9ligne %; pour lui ra:outer un code d*erreur 9ligne 3;.
%)1), #on0i"ur!tion S(rin" B NHi+ern!te
8evenons au pro:et Disual 'R "
en E!F, les fichiers E/pp.configF et ECao.<mlF configurent l*intgration =pring # N)ibernate
2.#.3.# Ge +ichier .Epp.con+ig/
?e fichier E/pp.configF est le suivant "
1. HIxl *ersion=11.31 enco!ing=1%t6J01 IK
2. Hcon6ig%rationK
3. HLJJ sections !e con6ig%ration JJK
+. Hcon6igSectionsK
-. Hsection8ro%p nae=1spring1K
.. Hsection nae=1parsers1 t"pe=1Spring.Context.S%pport.'aespace#arsersSectionFan!ler4 Spring.Core1 )K
/. Hsection nae=1obWects1 t"pe=1Spring.Context.S%pport.De6a%ltSectionFan!ler4 Spring.Core1 )K
0. Hsection nae=1context1 t"pe=1Spring.Context.S%pport.ContextFan!ler4 Spring.Core1 )K
2. H)section8ro%pK
13. Hsection nae=1log+net1 t"pe=1log+net.Con6ig.5og+'etCon6ig%rationSectionFan!ler4log+net1 )K
11. H)con6igSectionsK
12.
13.
1+. HLJJ con6ig%ration Spring JJK
1-. HspringK
1.. HparsersK
1/. Hparser t"pe=1Spring.Data.Con6ig.Database'aespace#arser4 Spring.Data1 )K
10. H)parsersK
12. HcontextK
23. Hreso%rce %ri=1Dao.xl1 )K
21. H)contextK
22. H)springK
23.
2+. HLJJ T9is section contains t9e log+net con6ig%ration settings JJK
2-. HLJJ 'OT$ I=#O&T>'T$ C les logs ne sont pas acti6s par !,6a%t. Il 6a%t les acti*er par prograe
2.. a*ec lNinstr%ction log+net.Con6ig.OlCon6ig%rator.Con6ig%re();
2/. L JJK
20. Hlog+netK
22. Happen!er nae=1Console>ppen!er1 t"pe=1log+net.>ppen!er.Console>ppen!er1K
33. Hla"o%t t"pe=1log+net.5a"o%t.#attern5a"o%t1K
31. Hcon*ersion#attern *al%e=1PJ-le*el Plogger J PessagePnewline1 )K
32. H)la"o%tK
33. H)appen!erK
3+.
3-. HLJJ Set !e6a%lt logging le*el to D$B@8 JJK
3.. HrootK
3/. Hle*el *al%e=1D$B@81 )K
30. Happen!erJre6 re6=1Console>ppen!er1 )K
32. H)rootK
+3.
+1. HLJJ Set logging 6or Spring. 5ogger naes in Spring correspon! to t9e naespace JJK
+2. Hlogger nae=1Spring1K
+3. Hle*el *al%e=1I'7O1 )K
++. H)loggerK
+-.
+.. Hlogger nae=1Spring.Data1K
+/. Hle*el *al%e=1D$B@81 )K
+0. H)loggerK
+2.
-3. Hlogger nae=1'Fibernate1K
-1. Hle*el *al%e=1D$B@81 )K
-2. H)loggerK
-3. H)log+netK
-+.
--. H)con6ig%rationK
http"##tahe.developpe$.com
55#%&
1
?e fichier E/pp.configF ci-dessus configure =pring 9lignes &-2, !&-22;, log%net 9ligne !, lignes 24-&5; mais pas N)ibernate. ?es
ob:ets de =pring ne sont pas configurs dans E/pp.configF mais dans le fichier ECao.<mlF 9ligne 2;. ?a configuration de =pring #
N)ibernate +ui consiste ( dclarer des ob:ets =pring particuliers sera donc trouve dans ce fichier.
2.#.3.2 Ge +ichier .Dao.xml/
?e fichier ECao.<mlF +ui rassemble les ob:ets grs par =pring est le suivant "
1. HIxl *ersion=11.31 enco!ing=1%t6J01 IK
2. HobWects xlns=19ttpC))www.spring6raewor_.net1
3. xlnsC!b=19ttpC))www.spring6raewor_.net)!atabase1K
+.
-. HLJJ &e6erence! b" ain application context con6ig%ration 6ile JJK
.. H!escriptionK
/. >pplication Spring ) 'Fibernate
0. H)!escriptionK
2.
13. HLJJ Database an! 'Fibernate Con6ig%ration JJK
11. H!bCpro*i!er i!=1Db#ro*i!er1
12. pro*i!er=1="SMl.Data.="SMlClient1
13. connectionString=1Ser*er=local9ost;Database=!bpa?n9ibernate;@i!=root;#w!=;1)K
1+.
1-. HobWect i!=1'FibernateSession7actor"1 t"pe=1Spring.Data.'Fibernate.5ocalSession7actor"ObWect4
Spring.Data.'Fibernate321K
1.. Hpropert" nae=1Db#ro*i!er1 re6=1Db#ro*i!er1)K
1/. Hpropert" nae=1=apping>sseblies1K
10. HlistK
12. H*al%eKpaJ!aoJspringJn9ibernateH)*al%eK
23. H)listK
21. H)propert"K
22. Hpropert" nae=1Fibernate#roperties1K
23. H!ictionar"K
2+. Hentr" _e"=1!ialect1 *al%e=1'Fibernate.Dialect.="S(5-Dialect1)K
2-. Hentr" _e"=19ibernate.s9ow?sMl1 *al%e=16alse1)K
2.. H)!ictionar"K
2/. H)propert"K
20. Hpropert" nae=1$xposeTransaction>wareSession7actor"1 *al%e=1tr%e1 )K
22. H)obWectK
33.
31. HLJJ gestionnaire !e transactions JJK
32. HobWect i!=1transaction=anager1
33. t"pe=1Spring.Data.'Fibernate.FibernateTransaction=anager4 Spring.Data.'Fibernate321K
3+. Hpropert" nae=1Db#ro*i!er1 re6=1Db#ro*i!er1)K
3-. Hpropert" nae=1Session7actor"1 re6=1'FibernateSession7actor"1)K
3.. H)obWectK
3/.
30. HLJJ Fibernate Teplate JJK
32. HobWect i!=1FibernateTeplate1 t"pe=1Spring.Data.'Fibernate.8eneric.FibernateTeplate1K
+3. Hpropert" nae=1Session7actor"1 re6=1'FibernateSession7actor"1 )K
+1. Hpropert" nae=1Teplate7l%s9=o!e1 *al%e=1>%to1 )K
+2. Hpropert" nae=1Cac9e(%eries1 *al%e=1tr%e1 )K
+3. H)obWectK
++.
+-. HLJJ Data >ccess ObWects JJK
+.. HobWect i!=1pa!ao1 t"pe=1#a.Dao.Ser*ice.#aDaoSpring'Fibernate4 paJ!aoJspringJn9ibernate1 initJ
et9o!=1init1 !estro"Jet9o!=1!estro"1K
+/. Hpropert" nae=1FibernateTeplate1 re6=1FibernateTeplate1)K
+0. H)obWectK
+2. H)obWectsK
les lignes !!-!5 configurent la conne<ion ( la base de donnes EdbpamOnhibernateF. 7n H trouve "
le provider /C7.NET ncessaire ( la conne<ion, ici le provider du =ABC 1H=>?. 'ela impli+ue d*avoir la Cll
E1Hs+l.CataF dans les rfrences du pro:et.
la cha@ne de conne<ion ( la base de donnes 9serveur, nom de la base, propritaire de la conne<ion, son mot de
passe;
les lignes !&-22 configurent la SessionFactory de N)ibernate, l*ob:et +ui sert ( obtenir des sessions -Iibernate. 7n rappelle
+ue toute opration sur la base de donnes se fait ( l*intrieur d*une session N)ibernate. ?igne !&, on peut voir +ue la
SessionFactory est implmente par la classe =pring Spring.Data.-Iibernate.GocalSessionFactoryOb5ect trouve dans la Cll
Spring.Data.-Iibernate12.
ligne !I " la proprit DbPro4ider fi<e les param.tres de la conne<ion ( la base de donnes 9provider /C7.NET et cha@ne
de conne<ion;. Ici cette proprit rfrence l*ob:et DbPro4ider dfini prcdemment au< lignes !!-!5.
lignes !3-2 " fi<ent la liste des assemblH contenant des fichiers E].hbm.<mlF configurant des entits gres par
N)ibernate. ?a ligne !2 indi+ue +ue ces fichiers seront trouvs dans l*assemblH du pro:et. Nous rappelons +ue ce nom est
trouv dans les proprits du pro:et 'R. Nous rappelons galement +ue tous les fichiers E].hbm.<mlF ont t configurs
pour Jtre incorpors dans l*assemblH du pro:et.
lignes 22-23 " proprits spcifi+ues de N)ibernate.
http"##tahe.developpe$.com
5%#%&
ligne 2% " le dialecte =>? utilis sera celui de 1H=>?
ligne 2& " le =>? mis par N)ibernate n*appara@tra pas dans les logs de la console. 1ettre cette proprit ( true
permet de conna@tre les ordres =>? mis par N)ibernate. 'ela peut aider ( comprendre par e<emple pour+uoi
une application est lente lors de l*acc.s ( la base.
ligne 24 " la proprit ExposeTransactionE$areSessionFactory ( true va faire +ue =pring va grer les annotations de gestion des
transactions +ui seront trouves dans le code 'R. Nous H reviendrons lors+ue nous crirons la classe implmentant la
couche EdaoF.
les lignes 52-5I dfinissent le gestionnaire de transactions. ?( encore ce gestionnaire est une classe =pring de la Cll
Spring.Data.-Iibernate12. 'e gestionnaire a besoin de conna@tre les param.tres de conne<ion ( la base de donnes 9ligne
5%; ainsi +ue la SessionFactory de N)ibernate 9ligne 5&;.
les lignes 52-%5 dfinissent les proprits de la classe IibernateTemplate, l( encore une classe de =pring. 'ette classe sera
utilise comme classe utilitaire dans la classe implmentant la couche EdaoF. Elle facilite les interactions avec les ob:ets
N)ibernate. 'ette classe a certaines proprits +u*il faut initialiser "
ligne % " la SessionFactory de N)ibernate
ligne %! " la proprit TemplateFlush8ode fi<e le mode de sHnchronisation du conte<te de persistance N)ibernate
avec la base de donnes. ?e mode Euto fait +u*il H aura sHnchronisation "
( la fin d*une transaction
avant une opration select
ligne %2 " les re+uJtes )>? 9)ibernate >uerH ?anguage; seront mises en cache. 'ela peut amener un gain de
performance.
les lignes %I-%4 dfinissent la classe d*implmentation de la couche EdaoF
ligne %I " la couche EdaoF va Jtre implmente par la classe E-amdao=pringN)ibernateF de la Cll Epam-dao-
spring-nhibernateF. /pr.s instanciation de la classe, la mthode init de la classe sera immdiatement e<cute. / la
fermeture du conteneur =pring, la mthode destroy de la classe sera e<cute.
ligne %3 " la classe E-amCao=pringN)ibernateF aura une proprit IibernateTemplate +ui sera initialise avec la
proprit IibernateTemplate de la ligne 52.
%)1)- I/(l/ent!tion de l! couc*e 6d!o7
2.#.J.# Ge s;uelette de la classe dDimpl>mentation
?*interface EI-amCaoF est la suivante "
1. %sing #a.Dao.$ntites;
2.
3. naespace #a.Dao.Ser*ice :
+. p%blic inter6ace I#aDao :
-. )) liste !e to%tes les i!entit,s !es eplo",s
.. $plo"eQR 8et>llI!entites$plo"es();
/. )) %n eplo", partic%lier a*ec ses in!enit,s
0. $plo"e 8et$plo"e(string ss);
2. )) liste !e to%tes les cotisations
13. Cotisations 8etCotisations();
11. ;
12. ;
ligne ! " on importe l*espace de noms des entits de la couche EdaoF.
ligne 5 " la couche EdaoF est dans l*espace de noms E-am.Cao.=erviceF. ?es lments de l*espace de noms
E-am.Cao.EntitesF peuvent Jtre crs en plusieurs e<emplaires. ?es lments de l*espace de noms E-am.Cao.=erviceF sont
crs en un uni+ue e<emplaire 9singleton;. '*est ce +ui a :ustifi le choi< des noms des espaces de noms.
ligne % " l*interface s*appelle EI-amCaoF. Elle dfinit trois mthodes "
ligne I, EAet/llIdentitesEmploHesF rend un tableau d*ob:ets de tHpe EEmploHeF +ui reprsente la liste des assistantes
maternelles sous une forme simplifie 9nom, prnom, ==;.
ligne 4, EAetEmploHeF rend un ob:et EEmploHeF " l*emploH +ui a le nN de scurit sociale pass en param.tre ( la
mthode avec les indemnits lies ( son indice.
ligne !, EAet'otisationsF rend l*ob:et E'otisationsF +ui encapsule les tau< des diffrentes cotisations sociales ( prlever
sur le salaire brut.
?e s+uelette de la classe d*implmentation de cette interface avec le support =pring # N)ibernate pourrait Jtre le suivant "
1. %sing S"ste;
2. %sing S"ste.Collections;
3. %sing S"ste.Collections.8eneric;
http"##tahe.developpe$.com
5&#%&
+. %sing #a.Dao.$ntites;
-. %sing Spring.Data.'Fibernate.8eneric.S%pport;
.. %sing Spring.Transaction.Interceptor;
/.
0. naespace #a.Dao.Ser*ice :
2. p%blic class #aDaoSpring'Fibernate C FibernateDaoS%pport4 I#aDao :
13. )) c9aps pri*,s
11. pri*ate Cotisations cotisations;
12. pri*ate $plo"eQR eplo"es;
13.
1+. )) init
1-. QTransaction(&ea!Onl" = tr%e)R
1.. p%blic *oi! init() :
1/. ...
10. ;
12.
23. )) s%ppression obWet
21. p%blic *oi! !estro"() :
22. i6 (FibernateTeplate.Session7actor" L= n%ll) :
23. FibernateTeplate.Session7actor".Close();
2+. ;
2-. ;
2..
2/. )) liste !e to%tes les i!entit,s !es eplo",s
20. p%blic $plo"eQR 8et>llI!entites$plo"es() :
22. ret%rn eplo"es;
33. ;
31.
32.
33. )) %n eplo", partic%lier a*ec ses in!enit,s
3+. QTransaction(&ea!Onl" = tr%e)R
3-. p%blic $plo"e 8et$plo"e(string ss) :
3.. ....
3/. ;
30.
32. )) liste !es cotisations
+3. p%blic Cotisations 8etCotisations() :
+1. ret%rn cotisations;
+2. ;
+3. ;
++. ;
ligne 2 " la classe E-amCao=pringN)ibernateF implmente bien l*interface de la couche EdaoF EI-amCaoF. Elle drive
galement de la classe =pring E)ibernateCao=upportF. 'ette classe a une proprit E)ibernateTemplateF +ui est initialise
par la configuration =pring +ui a t faite 9ligne 2 ci-dessous; "
1. HobWect i!=1pa!ao1 t"pe=1#a.Dao.Ser*ice.#aDaoSpring'Fibernate4 paJ!aoJspringJn9ibernate1
initJet9o!=1init1 !estro"Jet9o!=1!estro"1K
2. Hpropert" nae=1FibernateTeplate1 re6=1FibernateTeplate1)K
3. H)obWectK
ligne ! ci-dessus, on voit +ue la dfinition de l*ob:et EpamdaoF indi+ue +ue les mthodes init et destroy de la classe
E-amCao=pringN)ibernateF doivent Jtre e<cutes ( des moments prcis. 'es deu< mthodes sont bien prsentes dans la
classe au< lignes !I et 2!.
lignes !&, 5% " annotations +ui font +ue la mthode annote sera e<cute dans une transaction. ?*attribut &eadOnly!true
indi+ue +ue la transaction est en lecture seule. ?a mthode +ui est e<cute dans la transaction peut lancer une e<ception.
Cans ce cas, un &ollback automati+ue de la transaction est fait par =pring. 'ette annotation limine le besoin de grer une
transaction au sein de la mthode.
ligne !I " la mthode init est e<cute par =pring immdiatement apr.s l*instanciation de la classe. Nous verrons +u*elle a
pour but d*initialiser les champs privs des lignes !! et !2. Elle se droulera dans une transaction 9ligne !&;.
les mthodes de l*interface EI-amCaoF sont implmentes au< lignes 24, 5& et %.
lignes 24-5 " la mthode EAet/llIdentitesEmploHesF se contente de rendre l*attribut de la ligne !2 initialis par la mthode
init.
lignes %-%2 " la mthode EAet'otisationsF se contente de rendre l*attribut de la ligne !! initialis par la mthode init.
2.#.J.2 Ges m>thodes utiles de la classe IibernateTemplate
Nous utiliserons les mthodes suivantes de la classe IibernateTemplate "
http"##tahe.developpe$.com
5I#%&
I5istHTK 7in!HTK(string reM%ete?9Ml) e<cute la re+uJte )>? et rend une liste d*ob:ets de tHpe T
I5istHTK 7in!HTK(string reM%ete?9Ml4
obWectQR)
e<cute une re+uJte )>? paramtre par des V. ?es valeurs de ces
param.tres sont fournis par le tableau d*ob:ets.
I5istHTK 5oa!>llHTK() rend toutes les entits de tHpe T
Il e<iste d*autres mthodes utiles +ue nous n*aurons pas l*occasion d*utiliser +ui permettent de retrouver, sauvegarder, mettre ( :our
et supprimer des entits "
T 5oa!HTK(obWect i!) met dans la session N)ibernate l*entit de tHpe T aHant la cl primaire id.
*oi! Sa*eOr@p!ate(obWect
entit,)
ins.re 9IN=E8T; ou met ( :our 96-C/TE; l*ob:et entit> selon +ue celui-ci a une cl
primaire 96-C/TE; ou non 9IN=E8T;. ?*absence de cl primaire peut Jtre configur
par l*attribut unsa4ed94alues du fichier de configuration de l*entit. /pr.s l*opration
Sa4eOr'pdate, l*ob:et entit> est dans la session N)ibernate.
*oi! Delete(obWect entit,) supprime l*ob:et entit> de la session N)ibernate.
2.#.J.1 Impl>mentation de la m>thode init
?a mthode init de la classe E-amCao=pringN)ibernateF est par configuration la mthode e<cute apr.s instanciation par =pring
de la classe. Elle a pour but de mettre en cache local, les identits simplifies des emploHs 9nom, prnom, ==; et les tau< de
cotisations. =on code pourrait Jtre le suivant.
1. QTransaction(&ea!Onl" = tr%e)R
2. p%blic *oi! init() :
3. tr" :
+. )) on r,c%pXre la liste sipli6i,e !es eplo",s
-. I5istHobWectQRK lignes = FibernateTeplate.7in!HobWectQRK(1select e.SS4e.'o4e.#reno
6ro $plo"e e1);
.. )) on la et !ans %n tablea%
/. eplo"es = new $plo"eQlignes.Co%ntR;
0. int i = 3;
2. 6oreac9 (obWectQR ligne in lignes) :
13. eplo"esQiR = new $plo"e() : SS = ligneQ3R.ToString()4 'o = ligneQ1R.ToString()4
#reno = ligneQ2R.ToString() ;;
11. i]];
12. ;
13. )) on et les ta%x !e cotisations !ans %n obWet
1+. cotisations = (FibernateTeplate.5oa!>llHCotisationsK())Q3R;
1-. ; catc9 ($xception ex) :
1.. )) on trans6ore lNexception
1/. t9row new #a$xception(string.7orat(1$rre%r !NaccXs [ la BD C Q:3;R14 ex.ToString())4
+3);
10. ;
12. ;
ligne & " une re+uJte )>? est e<cute. Elle demande les champs ==, Nom, -renom de toutes les entits Employ>. Elle
rend une liste d*ob:ets. =i on avait demand l*intgralit de l*emploH sous la forme Xselect e from EmploHe eX, on aurait
rcupr une liste d*ob:ets de tHpe Employe.
lignes 3-!2 " cette liste d*ob:ets est copie dans un tableau d*o:ets de tHpe Employe.
ligne !% " on demande la liste de toutes les entits de tHpe Cotisations. 7n sait +ue cette liste n*a +u*un lment. 7n rcup.re
donc le premier lment de la liste pour avoir les tau< de cotisations.
les lignes 3 et !% initialisent les deu< champs privs de la classe.
2.#.J.3 Impl>mentation de la m>thode ,etEmploye
?a mthode ,etEmploye doit rendre l*entit EmploH aHant un nN == donn. =on code pourrait Jtre le suivant "
1. QTransaction(&ea!Onl" = tr%e)R
2. p%blic $plo"e 8et$plo"e(string ss) :
3. I5istH$plo"eK eplo",s = n%ll;
+. tr" :
-. )) reM%^te
http"##tahe.developpe$.com
53#%&
.. eplo",s = FibernateTeplate.7in!H$plo"eK(1select e 6ro $plo"e e w9ere e.SS=I14 new
obWectQR:ss;);
/. ; catc9 ($xception ex) :
0. )) on trans6ore lNexception
2. t9row new #a$xception(string.7orat(1$rre%r !NaccXs [ la BD lors !e la !ean!e !e
lNeplo", !e n\ ss Q:3;R C Q:1;R14 ss4 ex.ToString())4 +1);
13. ;
11. )) aJtJon r,c%p,r, %n eplo", I
12. i6 (eplo",s.Co%nt == 3) :
13. )) on signale le 6ait
1+. t9row new #a$xception(string.7orat(15Neplo", !e n\ ss Q:3;R nNexiste pas14 ss)4 +2);
1-. ; else :
1.. ret%rn eplo",sQ3R;
1/. ;
10. ;
ligne I " obtient la liste des emploHs aHant un nN == donn
ligne !2 " normalement si l*emploH e<iste on doit obtenir une liste ( un lment
ligne !% " si ce n*est pas le cas, on lance une e<ception
ligne !I " si c*est le cas, on rend le premier emploH de la liste
%)% Tests de l! couc*e 6d!o7
%)%)1 e (ro8et Cisu!l Studio
?e pro:et Disual =tudio a d:( t prsent. 8appelons-le "
en E!F, le pro:et dans sa globalit
en E2F, les diffrentes classes du pro:et. ?e dossier EtestsF contient un test console E1ain.csF et un test unitaire EN6nit.csF.
en E5F, le programme E1ain.csF est compil.
en E%F, le fichier EN6nit.csF n*est pas gnr.
le pro:et est une application console. ?a classe e<cute est celle prcise en E&F, la classe du fichier E1ain.csF.
http"##tahe.developpe$.com
54#%&
3
2
1
5
4
%)%)% e (ro"r!//e de test console 6M!in)cs7
?e programme de test E1ain.csF est e<cut dans l*architecture suivante "
Il est charg de tester les mthodes de l*interface EI-amCaoF. 6n e<emple basi+ue pourrait Jtre le suivant "
1. %sing S"ste;
2. %sing #a.Dao.$ntites;
3. %sing #a.Dao.Ser*ice;
+. %sing Spring.Context.S%pport;
-.
.. naespace #a.Dao.Tests :
/. p%blic class =ain#aDaoTests :
0. p%blic static *oi! =ain() :
2. tr" :
13. )) instanciation co%c9e Q!aoR
11. I#aDao paDao = (I#aDao)Context&egistr".8etContext().8etObWect(1pa!ao1);
12. )) liste !es i!entit,s !es eplo",s
13. 6oreac9 ($plo"e $plo"e in paDao.8et>llI!entites$plo"es()) :
1+. Console.Trite5ine($plo"e.ToString());
1-. ;
1.. )) %n eplo", a*ec ses in!enit,s
1/. Console.Trite5ine(1JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ1);
10. Console.Trite5ine(paDao.8et$plo"e(12-+13+2+3+2.3-01));
12. Console.Trite5ine(1JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ1);
23. )) liste !es cotisations
21. Cotisations cotisations = paDao.8etCotisations();
22. Console.Trite5ine(cotisations.ToString());
23. ; catc9 ($xception ex) :
2+. )) a66ic9age exception
2-. Console.Trite5ine(ex.ToString());
2.. ;
2/. ))pa%se
20. Console.&ea!5ine();
22. ;
33. ;
31. ;
ligne !! " on demande ( =pring une rfrence sur la couche EdaoF.
lignes !5-!& " test de la mthode EAet/llIdentitesEmploHesF de l*interface EI-amCaoF
ligne !4 " test de la mthode EAetEmploHeF de l*interface EI-amCaoF
ligne 2! " test de la mthode EAet'otisationsF de l*interface EI-amCaoF
Spring, -Iibernate et log3net sont configurs par le fichier E/pp.configF tudi au paragraphe 2.!.%.!, page 55.
?*e<cution faite avec la base de donnes dcrite au paragraphe !.2, page &, donne le rsultat console suivant "
1. Q2-+13+2+3+2.3-04Go%*einal4=arie4444R
2. Q2.312++32111/+245a*erti4G%stine4444R
3. JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
+. Q2-+13+2+3+2.3-04Go%*einal4=arie4- r%e !es oisea%x4St Corentin4+22334Q24 2414 2414 3414 1-RR
-. JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
.. Q34+24.41-424324/400R
lignes !-2 " les 2 emploHs de tHpe EEmploHeF avec les seules informations E==, Nom, -renomF
ligne % " l*emploH de tHpe EEmploHeF aHant le nN de scurit sociale E2&%!%2%%2I&4F
ligne & " les tau< de cotisations
http"##tahe.developpe$.com
52#%&
2
1
B.
'ouche d*acc.s
au< donnes
Ed!oF
'onnecteur
EA.O)NETF
S5B.
'ouche
EconsoleF
1ain.cs
Pramework
ES(rin"#
NHi+ern!teF
=-8INA
%)%)3 Tests unit!ires !?ec NDnit
Nous passons maintenant ( un test unitaire N6nit. ?e pro:et Disual =tudio de la couche EdaoF va voluer de la faKon suivante "
en E!F, le programme de test EN6nit.csF
en E2,5F, le pro:et va gnrer une C?? nomm Epam-dao-spring-nhibernate.dllF
en E%F, la rfrence ( la C?? du framework N6nit " Enunit.framework.dllF
en E&F, la classe E1ain.csF ne sera pas incluse dans la C?? Epam-dao-spring-nhibernateF
en EIF, la classe EN6nit.csF sera incluse dans la C?? Epam-dao-spring-nhibernateF
?a classe de test N6nit est la suivante "
1. %sing S"ste.Collections;
2. %sing '@nit.7raewor_;
3. %sing #a.Dao.Ser*ice;
+. %sing #a.Dao.$ntites;
-. %sing Spring.ObWects.7actor".Ol;
.. %sing Spring.Core.IO;
/. %sing Spring.Context.S%pport;
0.
2. naespace #a.Dao.Tests :
13.
11. QTest7ixt%reR
12. p%blic class '%nit#aDao C >ssertionFelper :
13. )) la co%c9e Q!aoR [ tester
1+. pri*ate I#aDao paDao = n%ll;
1-.
1.. )) constr%cte%r
1/. p%blic '%nit#aDao() :
10. )) instanciation co%c9e Q!aoR
12. paDao = (I#aDao)Context&egistr".8etContext().8etObWect(1pa!ao1);
23. ;
21.
22. )) init
23. QSet@pR
2+. p%blic *oi! Init() :
2-.
2.. ;
2/.
20. QTestR
22. p%blic *oi! 8et>llI!entites$plo"es() :
33. )) *,ri6ication nbre !Neplo"es
31. $xpect(24 $M%alTo(paDao.8et>llI!entites$plo"es().5engt9));
32. ;
33.
3+. QTestR
3-. p%blic *oi! 8etCotisations() :
3.. )) *,ri6ication ta%x !e cotisations
3/. Cotisations cotisations = paDao.8etCotisations();
30. $xpect(3.+24 $M%alTo(cotisations.Csg&!s).Tit9in(1$J3.));
32. $xpect(..1-4 $M%alTo(cotisations.Csg!).Tit9in(1$J3.));
+3. $xpect(2.324 $M%alTo(cotisations.Sec%).Tit9in(1$J3.));
+1. $xpect(/.004 $M%alTo(cotisations.&etraite).Tit9in(1$J3.));
+2. ;
http"##tahe.developpe$.com
%#%&
6
4
5
3
2
1
+3.
++. QTestR
+-. p%blic *oi! 8et$plo"eI!enites() :
+.. )) *,ri6ication in!i*i!%s
+/. $plo"e eplo"e1 = paDao.8et$plo"e(12-+13+2+3+2.3-01);
+0. $plo"e eplo"e2 = paDao.8et$plo"e(12.312++32111/+21);
+2. $xpect(1Go%*einal14 $M%alTo(eplo"e1.'o));
-3. $xpect(2.14 $M%alTo(eplo"e1.In!enites.BaseFe%re).Tit9in(1$J3.));
-1. $xpect(15a*erti14 $M%alTo(eplo"e2.'o));
-2. $xpect(1.234 $M%alTo(eplo"e2.In!enites.BaseFe%re).Tit9in(1$J3.));
-3. ;
-+.
--. QTestR
-.. p%blic *oi! 8et$plo"eI!enites2() :
-/. )) *,ri6ication in!i*i!% inexistant
-0. bool erre%r = 6alse;
-2. tr" :
.3. $plo"e eplo"e1 = paDao.8et$plo"e(1xx1);
.1. ; catc9 :
.2. erre%r = tr%e;
.3. ;
.+. $xpect(erre%r4 Tr%e);
.-. ;
... ;
./. ;
ligne !! " la classe a l*attribut ETestFixtureF +ui en fait une classe de test EN6nitF.
ligne !2 " la classe drive de la classe utilitaire EssertionIelper du framework -'nit 9( partir de la version 2.%.I;.
ligne !% " le champ priv EpamCaoF est une instance de l*interface d*acc.s ( la couche EdaoF. 7n notera +ue le tHpe de ce
champ est une inter0!ce et non une cl!sse. 'ela signifie +ue l*instance EpamCaoF ne rend accessibles +ue des mthodes,
celles de l*interface EI-amCaoF.
les mthodes testes dans la classe sont celles aHant l*attribut ETestF. -our toutes ces mthodes, le processus de test est le
suivant "
la mthode aHant l*attribut ESet'pF est tout d*abord e<cute. Elle sert ( prparer les ressources 9conne<ions rseau,
conne<ions au< bases de donnes, ...; ncessaires au test.
puis la mthode ( tester est e<cute
et enfin la mthode aHant l*attribut ETearDo$nF est e<cute. Elle sert gnralement ( librer les ressources mobilises par
la mthode d*attribut ESet'pF.
dans notre test, il n*H a pas de ressources ( allouer avant cha+ue test et ( dsallouer ensuite. /ussi n*avons-nous pas besoin
de mthode avec les attributs ESet'pF et ETearDo$nF. -our l*e<emple, nous avons prsent, lignes 25-2I, une mthode avec
l*attribut ESet'pF.
lignes !3-2 " le constructeur de la classe initialise le champ priv EpamCaoF ( l*aide de =pring et E/pp.configF.
lignes 22-52 " testent la mthode EAet/llIdentitesEmploHesF
lignes 5&-%2 " testent la mthode EAet'otisationsF
lignes %&-&5 " testent la mthode EAetEmploHeF
lignes &I-I& " testent la mthode EAetEmploHeF lors d*une e<ception.
?a gnration du pro:et cre la C?? Epam-dao-spring-nhibernate.dllF dans le dossier Ebin#8eleaseF "
7n charge la C?? Epam-dao-spring-nhibernate.dllF avec l*outil EN6nit-AuiF, version 2.& et on e<cute les tests "
http"##tahe.developpe$.com
%!#%&
'i-dessus, les tests ont t russis.
%)%), 5nr!tion de l! . de l! couc*e 6d!o7
6ne fois crite et teste la classe E-amCaoN)ibernateF, on gn.rera la C?? de la couche EdaoF de la faKon suivante "
E!F, les programmes de test sont e<lus de l*assemblH du pro:et
E2,5F, configuration du pro:et
E%F, gnration du pro:et
la C?? est gnre dans le dossier Ebin#8eleaseF E&F.
3 #onclusion
Nous avons prsent les concepts importants de Nhibernate. ?e code des e<emples est disponible ( l*6rl
Ehttp"##tahe.developpe$.com#dotnet#nhibernateF sous la forme de deu< pro:ets Disual =tudio 2!.
http"##tahe.developpe$.com
%2#%&
4
5
2
1
3
?e pro:et Epam-nhibernate-demosF est accompagn de trois fichiers de configuration E!F "
un pour le =gbd 1H=>? E/pp.config.1H=>?F
un pour le =gbd =>? =erver E/pp.config.=>?=erverF
un pour le =gbd =>? =erver 'ompact E/pp.config.=>?=erver'eF
-our les utiliser, il suffit de remplacer E/pp.configF par le fichier appropri.
En E2F, le dossier complet +ui accompagne ce document "
le dossier EdatabasesF E5F contient
un script =>? pour gnrer la base 1H=>?
une base de donnes =>? =erver 2&
une base de donnes =>? =erver 'ompact 5.&
le dossier Elibnet%F E%F contient les C?? ncessaires au pro:et Disual =tudio.
les dossiers Epam-nhibernate-demosF et Epam-spring-nhibernate-daoF sont ceu< des deu< pro:ets Disual =tudio 2!
tudis prcdemment.
'e document peut Jtre ultrieurement approfondi par une tude de cas "
#onstruction d'une !((lic!tion trois couc*es !?ec ASP)NETE #$E S(rin")net et N*i+ern!te
Ehttp"##tahe.developpe$.com#dotnet#pam-aspnet#F
?*application de cette tude de cas a la structure ( trois couches suivante "
la couche E!-daoF 9daoLCata /ccess 7b:ect; s*occupe de l*acc.s au< donnes. 'elles-ci sont places dans une base de
donnes. ?a couche EdaoF utilise le framework Nhibernate pour accder au< donnes.
la couche E2-mtierF s*occupe de l*aspect mtier de l*application, le calcul d*une paie.
la couche E5-prsentationF s*occupe de la prsentation des donnes ( l*utilisateur et de l*e<cution de ses re+uJtes. '*est une
couche web # /=-.NET.
les trois couches sont rendues indpendantes gr^ce ( l*utilisation d*interfaces .NET
http"##tahe.developpe$.com
%5#%&
4
3
2
1
'ouche
E(rsent!tionF
'onnecteur
EA.O)NETF
Pramework
ENHi+ern!teF
'ouche d*acc.s
au< donnes
Ed!oF
'ouche
E/etierF
3
2
1
B. S5B.
=-8INA
l*intgration des diffrentes couches est ralise par S(rin")NET
Et puis bien sQr, on pourra lire des livres de rfrence tels +ue celui cit au dbut de ce document "
Titre " N)ibernate in /ction, Auteur " -ierre-)enri 0uat, Editeur " 1anning, ISBN-13 " 234-!25252%22%
http"##tahe.developpe$.com
%%#%&
Table des matires
1 INTRO.D#TION F 'ORM NHIBERNATE ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) %
1)1 A PA#E .E NHIBERNATE .ANS DNE AR#HITE#TDRE )NET EN #OD#HES))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))3
1)% A BASE .E .ONNGES EHEMPE))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))-
1)3 E PROIET #$ .E .GMONSTRATION)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))'
!.5.! '7NPIA68/TI7N CE ?/ '7NNEUI7N _ ?/ B/=E CE C7NN`E=.............................................................................................................. 4
!.5.2 '7NPIA68/TI7N C6 1/--INA T/B?E= S--T'?/==E=............................................................................................................................. !5
#.1.2.#8apping de la table .cotisations/...................................................................................................................................................................... #3
#.1.2.28apping de la table .indemnites/..................................................................................................................................................................... #J
#.1.2.18apping de la table .employes/........................................................................................................................................................................ #0
1), 'API .E NHIBERNATE)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))1'
!.%.! ?*7B,ET =E==I7NP/'T78[........................................................................................................................................................................... !2
!.%.2 ?/ =E==I7N N)IBE8N/TE............................................................................................................................................................................ !2
!.%.5 ?*INTE8P/'E I=E==I7N................................................................................................................................................................................. 2
!.%.% ?*INTE8P/'E I>6E8[................................................................................................................................................................................... 2!
1)- 9DE9DES EHEMPES .E #O.E)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))%1
!.&.! 7BTENI8 ?E '7NTEN6 CE ?/ B/=E........................................................................................................................................................... 22
!.&.2 IN=`8E8 CE= C7NN`E= C/N= ?/ B/=E...................................................................................................................................................... 2%
!.&.5 8E')E8')E C*6N E1-?7[`........................................................................................................................................................................ 2I
!.&.% IN=E8TI7N C*ENTIT`= IND/?ICE=.............................................................................................................................................................. 23
!.&.& '8`/TI7N CE CE6U INCE1NIT`= CE 1a1E INCI'E _ ?*INT`8IE68 C*6NE T8/N=/'TI7N........................................................... 24
!.&.I '8`/TI7N CE CE6U INCE1NIT`= CE 1a1E INCI'E )78= T8/N=/'TI7N........................................................................................ 22
% INTG5RATION SPRIN5 B NHIBERNATE ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) 3&
%)1 A #OD#HE 6.AO7 .'A##JS ADH .ONNGES)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))3&
2.!.! ?E -87,ET DI=6/? =T6CI7 'R CE ?/ '76')E EC/7F........................................................................................................................... 5
2.!.2 ?/ '7NPIA68/TI7N C6 -87,ET 'R.......................................................................................................................................................... 5!
2.!.5 ?E= ENTIT`= CE ?/ '76')E EC/7F............................................................................................................................................................ 5!
2.!.% '7NPIA68/TI7N =-8INA # N)IBE8N/TE................................................................................................................................................ 55
2.#.3.#Ge +ichier .Epp.con+ig/..................................................................................................................................................................................... 11
2.#.3.2Ge +ichier .Dao.xml/....................................................................................................................................................................................... 13
2.!.& I1-?`1ENT/TI7N CE ?/ '76')E EC/7F................................................................................................................................................. 5&
2.#.J.#Ge s;uelette de la classe dDimpl>mentation......................................................................................................................................................... 1J
2.#.J.2Ges m>thodes utiles de la classe IibernateTemplate.......................................................................................................................................... 10
2.#.J.1Impl>mentation de la m>thode init.................................................................................................................................................................... 1K
2.#.J.3Impl>mentation de la m>thode ,etEmploye...................................................................................................................................................... 1K
%)% TESTS .E A #OD#HE 6.AO7))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))3'
2.2.! ?E -87,ET DI=6/? =T6CI7.......................................................................................................................................................................... 54
2.2.2 ?E -87A8/11E CE TE=T '7N=7?E E1/IN.'=F........................................................................................................................................ 52
2.2.5 TE=T= 6NIT/I8E= /DE' N6NIT................................................................................................................................................................... %
2.2.% A`N`8/TI7N CE ?/ C?? CE ?/ '76')E EC/7F.................................................................................................................................... %2
3 #ON#DSION )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ,%
http"##tahe.developpe$.com
%&#%&