夏昕.深入浅出 Hibernate

You might also like

You are on page 1of 565

Btoadview®

www.bro.d .. lew.com.cn

-

,

~ ~ of :r ;lJ;-:t fth. ':!

~ P!ISHING HOUSE~ ELE~TRONICS IN!STRY· •

_ ......... http://www.phel.com.cn

1f q- :r 1." tt M. ~:i.

Publishing House of Electronics Industry

i~* · BEIJING

*~IE1[n~_t~IJIfiJr-¥zI¥J7f1it)(~ OpenDoc ~7tl § IEX~I¥J~ffi'x~ «Hibernate 7f~ m~»~~OO*o~~~tl~~,~~~~~*ff7~~~m~m~,~~~~}~L~ffT mF.?:5!iH-to *~JAfif~~A¥, 1J1l±i~it/1C~J&~$f!iRMB9m*, 1tr*.~-F I§1WJi1tH!~ :lI:5lif-'a<J ORM trrfil-Hibernateo JA-1'4iili~~A-¥, i#~ Hibernate a<J4**r! ~ftCW, ~~*.~~~~g~~ •••• ~tto*~~~~A~ili,*m~M~mR*~o~, ~ IE Hibernate Mi£.~ Hibernate ~lim~ Hibernate iBi~MttJm~nt7f, .~ Hibernate ~~o :l:R.(iJI: itT Hibernate B<J~limmr!~ ~limftC~~ OIR f!iRM, IU~tX:!fX, It!@~lt, HQL 3k}=JHi*~ § ~)(f#7-.. {t~f1, Hibernate @liPa ~~.~ Hibernate ~ J(.~fJHi*o Hibernate ?k~$7}-!J!~m --1'.~~~~€IJjfJ]J~~~7 Hibernate eg5!t*:9J~a<J~mD *4Slf*'i"a<Jm~, t£m~~iJt: ~7 Hibernate 'M"mt¥J~MlCfl~ Hibernate IA~ XDoclet .til:!.12.t& Hibernate l¥J~o: iBatis ~fflri, ifl2A-FJt~mA7tlili 7*4S9=JPffffla<JIJt&tx#, m~.JS-~7ti!"~l!Jai;bf1!~", ~*~*~~~~~, ~~m~~m~7-1'~~~~I¥J~~o

* -tH~~T Hibernate B9 ~1'1Ifr" ~ B<1it~ 0

*~~~, ~~~ffW~A.Md~.*~~.~d~.~~D KlittP.JTlf, f~;tt1Z\no

III ~ i£n&tIii EI (C I P) 1£.

~A~l±i Hibernate / IIYT, 1f~~, m~#liilf. ~t:;ij(: rt!~I~iliA&l±, 2005.6 ISBN 7-121-00670-7

I .~... II. CDI ... ®fr ... ®JY... III. JAVA m~-~J¥t2:it IV. TP312

]Jt{f~.: JiJ ~ ~rJi!k.

En ,fjjU: ~t*B iJj;bEplPtl:ff15[l0 ~

f:iH~~Jr : Et! ~ I~ f:i:! ~ *±

~~~m#u:i)flRJJ~i& 173 ffl*ff dI~~ 100036 f£ If: ~:likif$4SJi5

7f *: 787X980 1116 EP~: 35.75, ~Il:: 670 T~

E(1 IX: 2005 ~ 6 Jj ~ 1 (X$"Pd

$ ~: 6000 Jlfr JE:fft: 59.00 7G

~~~~~I~f:i:!~~l¥Jm~,~~~~~.,~~~~~m~~o~~m~~, ~~* l±~fJmnl*~o !fX~Et!i!: (010-) 682790770 m.tiiJFif~dI~flt.¥: zlts@phei.com.cn, ~n&{fti( lP1litiW~dJ~ftJ:~ dbqq@phei.com.cno

I have met both XiaXin and Xiaogang in person when I visited Shanghai in 2004. Before and after that Shaogang and I have corresponded for numerous occasions to exchange updates on the JBoss front and open source development and usage in China (especially the www.hibemate.org.cn site). I have worked on JBoss Cache since early 2003 and have witness first hand how can a successful open source project impact the enterprise computing world!

Hibernate is a pinnacle example of this phenomenon. It has won the 2003 and 2()()4 Jolt award (two years in a row), and I have had the fortune to accept the awards for Gavin and the whole team in both occasions. The awards gave credence to the success of the project. To me, Hibernate is not just another regular persistency layer library. It is also a very-easy-to-use and well-thought-out framework for which every open- (or even closed-) source project should mimic.

I have personally gone through numerous companies that were building in-house persistence ORM layer. It always started as a good idea. But as time evolved, project changes, and engineers come and go, it would become more difficult to maintain a proprietary persistence layer. A successful ORM solution like Hibernate makes the world all the more easier for us developers.

Hibernate became a JBoss sponsored project in October 2003. By becoming part of JBoss federation, Gavin and the other developers are able to concentrate more on making Hibernate a first grade project. In addition, since it now can provide 24x7 support through JBoss, it gives assurance to the big companies that it is a safe choice to adopt open source in full steam. This is also seen by the wild success of JBoss in year 2004.

A good piece of software needs extensive documentation to help readers to bridge the learning curve. When Xiaogang approached me with his idea of writing a Hibernate book in China and asked for a preface, I was delighted to do it.

This book starts with the introduction of persistence layer, then goes into the Hibernate framework and API, and finally illustrates with examples for advanced usage. Good understand of the persistence principle is not only a prerequisite to Hibernate but also to almost every single

iJ!A~ff:j Hibemate

ii

real life project. Finally, by going through the examples, I hope the readers will discover just how easy it is to apply Hibernate to your projects at work.

-Ben Wang, Ph.D., lead Clustering and JBossCache-Aop, JBoss, Inc., 2005

"

20041f:J1tijj IblJ:~B<J~f~, ~i£ ~IIiff~~~~ttoo" tE}j~mrJ§, ~~~mf:fu$ij\ 3tmt, ~i!ag J*J~~ni JBoss B<Jmrill-J!M~lk ~ OOB<J1f~~f-tii_q,ff1t-~~m (:1t1t~flj 7 Hibemate.org.cn flli#.J" § 20031f:*JJ7fMt, ~3&jJr JBoss Cache B"J1f:&, ][it~iiE7~ ~~~~1f~~§~~~rr.~~B<J~m~~~B"J~~!

Hibernate ~~~iJiljtB"J.*f" El!~.~ 1 2003 !=j 2004 '¥1I1¥J Jolt *~, !lti&5f,!-f: ~g~j1ij(j\jJ Gavin ~~~l~HA~@iJ&-~J.mD *~~Jm § pX;J}J(J{j{fhiiEfJ)L ~&*iJL Hibernate /G{~:f:x.~-~~)ji¥J~~1t~~.flf, 't:~~~~11t ~rftm .. r~~i,'l¥Jm~, #f= ~*~~§(~~a~~~~§)~~~~~~~"

!1t~~~1- A~ffi7f8¥ttJL1-0~, ftBffJ~1-f § c~~ ORM f#~JiL Ii9IJ*Mt(J{J~flj, ~~.~1-M~.,m~~.~~~.,~§~~, I~~*IX~,.~-1-~1fF~ 1¥Jt#.?'Ji.E~f'~*~~Xlo ~~ Hibernate ~ff~J}]a<J ORM F&1i1ftifJ7f~~~1:m~~ ~~$1"

JA 2003 '¥ 10 ~tQ, Hibernate pX;1-J moss ~WJfi<JJ.m § 0 EBr:£ moss ~.g..1*B<J-$7t, Gavin ~Jtft21f1t~IlJ~.rpMjJre Hibernate 1T~JJX:~-mta<JJ9! § o~.dtz.."r, ~~ JBoss ff~gjJtl!{jt 7 X 24 IJ'!J1a<Jnll*x!#, Mffij~7f~f-ti1?,IEA*0 ~ B<J~mtff~~1Jt 71*iiE" J2;.)A JBoss tE 2004 ,¥B<J§*JJX:J}Jmt~~#ttlD

M~~#5~$.~~~*~~.#M~~~fi<J~.,,§~m~wa,~mn.~~ ~~~~~-*~f Hibernate B<J-t5, *~~~-t5f1=ij!a<J~1~, ~A&s;~fm~l!~'¥;-"

* -t5 JA 1rffi ~ fA {t~ 7f M1, ~J5*A iU Hibernate m!!t@~ API a<J mJ 11 , • J§ ~ 7J' 7 iii ~ffl ¥!~~-w~ 0 X1~~ 1tl~J!lHflJ!WJlIM, /G'iX &~{tffl Hibernate a<Jiitrt:lt*ftf:, ~f& ~.~B<J~§®~~~m~~~a<JoaM~~M~,~*.~#.~.~~,reffibem~ mf~If1=~~~§~*~~~*~.o

JBoss 0irJ.M ~ Cache-Aop ~IV.. J:~m± 2005 ~ 4 Ji

il!Ai*/:J:J Hibernate

Hibernate ... Hibernate?

pijif:wr, ~*tEjg0 ~F~Jlt1r1i*m~;il'g~Bt, X~ra]:(£ SourceForge Jln § 7tl~~ ~ ilj "Hibernate" i3: 1- ~e 1": [f.] ~ ~" 1W~ - ~ ~"" ~:~r~, 'F ~ T 33: 1-/J\ IJ\ ~~fi itt'§. , 1£ )i:M33: IX fjl¥ ,12, m Jf~, Hibernate B ft MI;g~1!r tiE ~ T PJ3 -t-*:I- 0 ~Q 4'-, W ~lf0 ~ rz: ~ ~B<J1lr, Hibernate fFjgtr-~ a<J~~!ili:f$~il, Bi£tEJfj]O:J:&:1i:;8f{@1T, rp li]Ijfij@1T ~ ~liJ.fiOO~~~~rp~~~ •• T~--t-~~o

~T*.~§ffi~,~~~m,~~ •• $~B<J •• ,&£~~-~I~~a<Jmff~ *~*1HtnL

2003 ,¥, Hibernate ~WftEOO r*Jt1rt1T, tB-F~ Hibernate Jm § aqf~1f ~M*, ~1f~~ ~ § D:{fIft~I¥JJL\{~m~px;)(, T~F1: T OpenDoc ~7U § E8JtmRl¥J1ffi1tXt~-«(Hibernate Jfttmm», fJ 00 ~!1tjg Hibernate l¥J1lr ~-ffi"~rtZjJ 0

*·:f=HBiE~ EI3 «Hibernate ffttml¥i» 1t Ji mJ"7fEB<J 0 «Hibernate Jfttmm» ~ § EI3 ttm f¥J ~ ~ IE:rt X., *!k.tE ~ ~ fll1T)( 1: ~~~ r;R ~ ft~ 0 tE* ~ fJij 13 tt~ rp , ~ 1f ftt if;li OpenDoc ~#a<J&~,mm~H7~m~mm, ~~~~WB<Jr~~~~&Jltffl.~.~,,~Z «Hibernate lfttmm», *~~~1t1t7 6 {!fl~, ¥mi&~ §1frj Hibernate .iiPi&* 3.0 Jt& B<J r}] FJ~*l'11: o

1i*~1t:1l:--t-~*ffff~&lfa<Jtt~, m~1X$B<J~, *~~ft-A~!R §*~~ffi'll~Jt ga<J**o~~~~~m~~~A~MJ3:i1tI1t~~7W$*~~~~o

BJEm~ Hibernate 1f1J)(~rpJt~nilag~~#, 1m~OOr*J~!R* Hibernate CVS WC~, ~~ ~ Hibernate * i:tBffE , l¥.J!7ttr * o

m ~ ft jg 00 r*J 'It - Hibernate Eclipse 1i ftt (Tanghan Plugin) e<J ft ~, ~ Hibernate I¥J *tt~~fflill~~7ffi~~~e<J~~~~~~~~~o

~~~m.a~~A,~~~-t-M~tt~~fr~~*H~.~~o •• a~, ~~* {f~i~1:, A*!fim~-;;-, JA1i*131tftl~*J~!t-, 7C3T~~, JJ~¥iH1:J1t7E~fffftk*, 1J& ~J!-fi~tltEt-J@Hlo

iI!A~ Hibemate

jj,

f£*-tS~P~ !::Jit:W- .w..oomr yo, i9J~~iS:ff-.ff~, Jt\9='1C~M#i !::j~3C, ~~a<JX M'= ~ Ii tJt:m~X1~1fHttka<J.JmJt *m*~fl~*~*~~J9tl::a<Jm JtIJ a

,:{ wr 200S1f- 4}J 10 EJ 1l J: ~

*~~~1fJ -11lfF~)ijJ*f1: eq~*, IIVf~1ftEa*_t~J!JJt~:£m~ ~1*J~ ttl Js: l%J 11$)Xl.!¥J )Xl ffi : m ~ J! ~liljJ at~~ ¥, ftBre ~I 11= lf1/~ f61¥J 3i !ftt}~i=~ 11 ilJ Il9 TID J\ 1J a 1'FYg~i~3f~JlQ I§ Ef<J1lr-rri9J, -~*1,*Ef<J EI.~tB~1I1Jt!1-T~1fJl¥.l~f'Ffi~o ~JL\* m~~~M*~~~~m§,m~~Am3f~.~~~*¥~*o

t~i~ 20054- 4}] 10 a

*-t5i1J-f- IR}f~T Hibernate (fl OpenDoc (7fifj)[~), i3: 1'x.f§t£ Java ~±12{ tpmt~ 1llr-, ~*_tB~~~33 Hibernate l¥.l:1tJilf1~~o ~~i~~fIJ~~)c~ft-t, lt~i!£:jf: IE ~~~*A~~~~~~*An~~~~i3:~~Amili,~~)c.~.~,~a~3~. li~fH&P.$ ",*ij["o -T~7f~~JlIJ]fI(l~, 1r1"m~~lA1'-)(t~L~~iili~~*~ Hibernate 1-J _±JlfJ<J-vl!a*~lio

Hibernate 1'Fj;J Java ORM a<Jtt~7fiJj~~, B~px~ Java ORM a<J~#~mt ~'@~ JDBe 1JTlIl¥J1f~1f1W*7 ";tIif"o *-tS-tB*:m~~~Jlt.~~mzm-'D~A 1M Hibernate ffJ3f:&AjdW* "flif"o

Jt ~ 20051f- 4}J 10 a J:. i4-

i!iV\~ Hibemate

-----------'_.-'

~T Redsaga 51rr!Ino~ iii

~TOpenDoc

Open Doc ~ ft X1 [§ ftr tp 00 *~~m*Jij 00 7'~ ff~~ f4 , {S t;p ~ z. ffi * Jt ~~ I¥J J,W..1J\ ffil M Jft¥.l-1'-H1N)(*~~~it~rlo OpenDoc ffi![a;r.g'J:lL, [§ftr-E1t"54 {7}fft~!¥Jx~~, ,~9r~m

M400~t ~liU~~0*~~, ~r*.~*~~m*~*.~T.~~M~*mo

[§ 1VJ Open Doc '@! *l¥Jx~~1f: Hibernate Development Guide " iBatis Development Guide" Spring Development Guide" Web Work Development Guide, ff!}. PI J;.l ~ IOJ www.redsaga.com ~M, ~l(Rt?;11']B<J.ffi~*o

~~Jt~fix~.,~*.mm., ff~T~H~.~~.~.~~~~~~oX~ Et-J Hibernate Development Guide &P 1iJ * ~ I¥JHtr ~, 1£* -=r.; ~f~ ~ 1£ § * T iBatis aq Open Doc 0

i1t1I'J~-~QretttJi!!3&jJT OpenDoc I¥JttJi, *:iH~~rJr*~~#l¥r~~o X1ff~:k $*~X~, BFP~~~m~ft~~ftt tt~ili~o

fit {1'1 lli~_xim ~ i.t; -T 1tr ffim$X fif eg ~ ± hn A !It if'] ~ tr ~tl, ;tt ~ if £3 OpenDoc (fJ if ~ -.0

RedSaga.com oWirrtr· ffim) ~-1'-3&jJfmjj1ff1N.f~~tE~OO~Ji!¥J~rB]mt~o

~£~.~~-T2002~~~!¥J, ~:lL~B~~m~*~M~.~7~.m*:

www.CnPack.com (ffiJ~:pJ.g~JLI¥J Delphi aq7fifj1S!f4~)

www.JavaEye.com (ffitm. B~.lL1¥J Java tm~it~)

www.amova.net (Michael Chen EIJ JL l¥J javascript I¥J xml z~iIfiJ ffl ~}$) www.bjug.org ( ~tJk Java User Group , ~t* Java mp~_§.)

~ 1fJ i?- W ~ tt:!t!!l&JJ r ff tPtii ~ U!?J 1£ ~ 00 l¥J 1tJl t B m 4; tlld:1t J! ~ J! ~ l¥J Brl ~ C) Iii] M*M&~*~~ffl~.*~M, ~~~~~.~*OO~~tmff~.o

JIll\i*/:I:f Hibernate

--- .... ...,_.-_,.-."";~~~.-';,".',.~ • ....>th-~~~~

, f

~u

,

• I

*.m~A~X-ffi*~~~o~~"hl~h"~A~£~, a~~~.H*~OO~ A~£.~,~~.A~~&~~.M.~~*.I*,reA~M.~~~~~*.I~ ~~~lli*, ~~~~~~fiT~nm~~~o

~# •• 7A~~~.~~~.,.~~~~*~~~~ •• ~~~S-~,~*~ *fm~#i~7il1tf~{t" ~~mtf*X{tf:~mHt91Ai-T-~~:fl, PJ~4JtWJVff.§*~m q:r 893t3!:ilt _, •• ~~*&a"~~0M"~9.,~~~~~0.~#*~*,.-~ ••• ~ _mOO~~t ~m~~B~~.~M, ~~~.mm~o

it.mBYffl~~!Jt!m.~.m t .f1:*!Jt~~mB9~ilHtililBt .ji$!1!IJJl/J\~ !=jil~ sry1tmI $1'1 0 ff~jJi!iJ!f:1tJJ~mJifiJm, !tfn:;;fNfffl~:ruJ ~t¥t)Atf!x*~-JJi/J\/I) •• , R .~re~Mm~~~$MQ~,a.~~~.taJl~.N~*Wo~7~Mw~~,a mOOI~.Mft~.~~.,~*ft~fi.~AQw.,.~m., ~~~AD.H~~ ~~.~~~~*oDm$~~7amm.~.OO~~ho

~~fi~m,.~a.~~~~~~~~~,a~.~ft~~g*o~7~~~~- 1-mm:iAXma<J~~ftB9 §~, !tfr'J~hfjt)A~IR:~$o ~$OOI!, IR:tIi!$A<J.tb\*5t, !Il #~~})~~~mo

*~~.~~~f1:~Trr.o~~,~T**~~W~O~.~,*M~*~~~~ Trr.~, ODBC, BDE (Borland Database Engine), ADO, ADO.NET,JDBC a<J-e.1-'~'i*, 11 ~~~7.~~ttJ@M~~~*~.~~=.,~ffl~~~m.Mrr.~a~~.*~ ~a<J •• I*ofi~~P.A7§ •• #,e •• *#R~~~.$ft •• ~~I~, & ~~~x~~o~~~~mili~~~ff~n~,~H~Am~*~~~~a<J~~~M,~ u~~~~~m~~~w~E~~~-~,:;;f~~.~~~OOu~,~~.*~~~: ~ WW~*0m.~~~ ••• ~"~~"-~~~$#.~*?

:l:1t,~~i31 ®J91:~ 0 ~~-*m~L,OO~~~tt*ffiffi~~fi*o~*m~~~#H~*~~#~,~

NAiILi:I Hibemate

II

tt~w~~*m~m~~~,.&~~~~.~.~,m~*.~*~~m~A~~~m ~~~~~~*m~~~o£~oo~~.~*~~~~~~.m,~.~oo~#.tt*~ m~.H,~~£~~~"~#.~"~-m~.~~~ili~~~o~tt#OO~~.tt*~ ~~~~*~~Am~~~7~*.~~mft,N~$~~B~~~~~~,WMA~T tg A ~ fi~llH. X>j~~W:it ffJ }~,~ll~ WJ J[).$ 0

~.2m, **B~~~~~.~~~**fr~~*~, ~~~~~,IDBC~~OO [flJ 1r~ 8"Jf1:liff~~*~ Bm~W~JW.*t&:i&~, JA*i!~~D~J1o A 1fJ.i.R¥tlftffJPJf~ ~~,~ffl~* •• *~OO~~*~~.~o.~~~ffl~, .~~.~,w~~m~. Ii Jtt:~/J\ IR 1f~ $ n ~JJ!i&Jt~$n, ~~~It~X1~ -1'1*8"Jmwr 0 ~fil~m~~*ag~ ~,.fr~mft~~~*m~B~mh,~~~M;~~.m~~~.,~~~.~ffl~o

i3:~~-1'~~ ~t&ffijllJi~~JiJr..~! ~ 00 rPlxtjt ~If1A~ifJm~-it~*ft-t, A ff]~ui1L -:t~mr~1fi-p'p*I~ T, i3::wt~ Object !Relation Mapping -X>j~1c~ti:tw$~M ~

~*~~ml.,ftm.~*w~~.~ •• ~$.M~~*,~~~&*~~ffl~ ~ 7f tx: 8"J f'F ffl ~ ii!! 1fL

J§~~.11, ~~T ~ 1W.Jtff-llJi9it'~ ORM t:£-Hibernateo JA--t-~iilil¥Jt\fl !f!f~~A¥, ftffJijB! Hibernate ~~*~~ ~NC., 1t1t3T.j!J~ff, ~:i&1JU.~$j~ *fti, iE~E1n1E JDBe l=5 Hibernate l¥Jee.~m£zT 0

IWJ§, ft ff] ~~ *-1- ~w!J, ijf:~t£;9; I),rjJ1it § 7f tt ~, Wl fjJJ f!ffl Hibernate 0 ~ EJ~m ~ 1 Hibernate t¥J * ~ , ;It * 7lP _& I¥J ~ ~ t~} lZ, .M. J1l! § i¥J m ~ , itltl iA 1t5'c l¥J JjJj!IJ, .¥!J Hibernate ~{Jt~B' ffl~l),rjI¥JJJ~JRl7F Hibernate I¥JtltB, :X:-1-~M~~J.l, i.l:;&fr']-f1} IX ~~.]X\. f.ij 1& a<Ji)t fL p~ !

Al)§, ftfn~~{!t:T$-m-aqm~pg~, ;It~§m~ Hibernate t¥J1f.fia.1~1E: iBatis e<J1r m, iBatis ~-1'-~!1U'[agJ9i §, 1lJl;.L~f1::J!*" 13 i;J]it t¥J:IJi $ 1fl!::f , i.l:~-ar ~ 13 [3jjj¥* •• mM, ~w~~ •• ~m~~*~o

~OO~-1' mindmap, RlI.9lT Hibernate .m~B<Jti*~JJX;, -OOW!T~' ~~ml;.L!f7t:

JAJ1tOO9=' Tm Hibernate t¥J~ftij$tJ#, z)§, f;fGffJ~~Ja~,~_t Hibernate ~~~~"

i!!i!Ai*ftf Hibernate

,.,

I I !

I

,

i

,

i

,

I

:

I ,

,

I

!

J=! 14> J:&..f.; j

._---_ ..

\ \ i

!

I

1

1 \

\

Middlegen

III

!lddf.liA'YJII'kM
I r:
I ·~·tt , t(;ttx;
, If);
I
,
I
I
II
t ")IU<Wffi t 1-
, ~, 1lj: l' t< .t-~
,
I l'f.J II!Ut JiHf
I
(iltSQLfti11J
(Native SQL ~uery)
ffi. {1=(Component)~l
i#
1\
"
I \ PJitHIfi-
~\
I
,
,
\
, , (14) L !!'!'i'.PI! (

,

1I'J1:11·tflJXML)(f"i (XML Mapping)

,

AUribute lazy loading

, r:

;/

1/ I&IlIi sessioni't) Criteria

II API

ill

I I

5i#:r·~J;SQL (Hand write SQL support)

AndroMDA

Xdoclet Hibernatet' Tags

~~~()<J~Ji $tll''1

\, II'J/;ttft;~, JLSfi:2'

, +f1~UM

Roller Weblogger

Hibernate Console

I

1

\

-,

'¢:~~Ii!!l!.IERP~* ilf:1,v'm

Tanghan Eclipse Plugin

\

\\\ JMx:!t:H

1\ ._ .................. --

1\

P iJ!uQuery Jdltl: 'l':

\ \ il/lJll!~

\\ li:ft:l~{1'

\ (V irtualizationl

- __ ,--

Tene Board I Miracle

Hibernate S nchronizer

iJ!AfIIfJ Hibernate

.. 1" llil'iiJb'i.,m flCJ'tf"~m-tt,* 11 •• " 3

1.1 ~ ~ m M~ 4

1.2 ~~Ji!:iJiit 7

1.2. 1 ~ ~fi!:iJiit ~ffJlf*M* 7

1.2.2 ~~miJiit ~Wi~~~mA 28

1.3 t-if ~~ i)t it ~ ORM 42

1.3.1 ORM ;fI!ii:£: 43

1.3.2 f¥~m~f.m~~ 44

1.4 t-if ~mfl!.!Jrg~J& 47

].5 _±Vff:f,f ~mm~w.1i!: 48

• 2" Hibernate .iI, , " 53

• 3" ~~~ 57

3.1 ft.~ I 11= 58

3.1.1 .gIJ ~7J'f7tl ~11i!i ~ 59

3.1.2 ~}t Hibernate ~MHtfi!b 59

3.1.3 B3fl11i!i~F~~1iIfH~fi!?J 61

3.2 Hibernate l'icjfl 68

JI!A~ Hibemate

2

3.3 B it~c:i[ 71

3.4 m-~f-t~ 71

3.5 1-t~~}]m , , 77

.. 4" Hibernate ~~ 79

4.1 Hibernate ~iilii-B- X 80

4.1.1 Configuration 80

4.1.2 SessionFactory " 81

4.1.3 Session , 81

4.2 ~ilff~c:i[ 83

4.2.1 SessionFactory tNC:II: 84

4.2.2 :J:*tf~ , 87

4.3 Hibernate OIR ~M 91

4.3.1 Hibernate ¥*~ii~~ 91

4.3.2 ~ 1*~M 93

4.3.3 JWj~l!!1CM1t* 103

4.3.4 !i -€rIm 111

4.3.5 Blob .. Clob ~m: 8<J~M 116

4.3.6 ~i*~M~~ 126

4.4 ~~*ItX , 146

4.4.1 -xt-~If* 146

4.4.2 -X>j:$ ~1t* 153

4.4.3 ~X>t~~Ir* 160

4.5 Hibernate fim;f;It~ 164

4.5.1 Criteria Query 164

4.5.2 DetachedCriteria 170

~j;ffij Hibernate

3

4.5.3 Hibernate Query Language (HQL) 173

4.6 HQL ~ffl1i* 174

4.6.1 ~1*~i1iJ 174

4.6.2 rM1i~i1iJ 176

4.6.3 ~1*!1!~ ~IJ}lJ~ 178

4.6.4 )}fll f::iJ1iFJf 179

4.6.5 ~~m5E 180

4.6.6 IJI ffl lttilU 183

4.6.7 ~*~i1iJ 184

4.6.8 .:r- ltti1U 189

4.6.9 ~~.:bD~:1iJ:\ 190

4.6.10 SQL ~i1iJ 194

4.7 § 5E 5!... f,f !J....1.t ~ f_.W. 197

.. 5 .. Hibernate iIi.~ft. 201

5.1 Hibernate f,f!J....{.t~f_.W. 202

5.1.1 ~1*X1~~$}aJM 202

5.1.2 ~ 1*X1~ iR!i3IJ 208

5.1.3 ~~~H 222

5.1.4 Hibernate ~1mgJH , 225

5.1.5 .9r~f! 231

5.1.6 ~ !J....~~11: 245

5.1.7 Collection 283

5.1.8 rs*~tfFFf 289

5.2 Hibernate @li.fflJ ~~.,fJLft~ 292

5.2.1 Lifecyle Is Validatable 292

JI!A~ Hibemate

4

5.2.2 Interceptor 294

5.2.3 Interceptor A~@ffl 296

5.3 Hibernate ~ffl~* 300

5.3.1 Hibernate 7t JJ.[ 300

5.3.2 Session ~~ 302

5.3.3 Hibernate ff Spring Framework 306

5.3.4 Hibernate ttff~1::1t1t 311

.6. Hibernate ~4t:-_'&1J. RedSaga ~:ti 321

6.1 §J ~JF 322

6.1.1 pxJ:l~ffi1i!: 325

6.2 E-R ~.f~"kE~~$!.~m , 326

6.3 E-R ~m&IJl~ 330

6.3.1 Middlegen 331

6.3.2 Hibernate Synchronizer 339

6.4 X1$!..~m 345

6.5 J9i §J i¥J §J 3RmfJ{-fO~litf1iihi 345

6.5.1 § 3R~~ , 345

6.5.2 build *#f. 347

6.5.3 Hibernate Console ¥liiliIA 347

6.5.4 Tomcat ~~B 350

6.5.S .X1~M~*i¥Jifi~ 350

6.5.6 ~m*:;f;if 351

6.6 m~iJttt:7t 352

6.6.1 7f 'it IlJ~Ai¥J r*J $J@~"J !=j ~tt-z,_ $~i9!~iA 353

6.6.2 ~--1'-~~iJ\ 354

5

6.6.3 X1~-~~~iJt8<J7ttJT 358

6.6.4 'tR:l£~J.m~~iJt~ Q , 360

6.7 ~B, session ~$* , 362

6.8 Hibematelixception. Checked 366

6.9 Template/Callback 00 1t~ 9} 1J1i:. 374

6.10 ~OO: -.w§~1JEI.£fEJ<J;firf 377

6.11 JVjOO ~~ti~: MasterlDetail ±JA~~ 381

6.12 ~ti-=f~&J=t7t1l.[ 385

6.13 ~ Web !i!:~1I. 394

6.14 ~6~e-g~.m~JI.: 11.t~ 400

6.15 ~l!~IJ Hibernate 3 405

6.16 ~*m , ' 408

.. 7" '# m Hibernate .. MEW .. ~ , 411

7.1 hibernate-mapping iJ B 411

7.2 class 11 B~_)( 413

7.3 id"il B~_)( 415

7.4 ~'t1:l*f3t:~MNcjj[ 419

.. IJ ~ 1f.IilJ.elJ[lllt~ ~~ ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• ,,~~

8.1 m~ I 11= 429

8.2 ~~~f~ 43()

8.2.1 ~ 1"f MiddleGen 432

8.2.2 1~ &~ 8<J ~M ~ t't 435

8.2.3 1~&~~f3iI¥J~M Jltt 437

1IlAi*ffj Hibemate

6

8.2.4 1~~!ft::X:IfJ(::X:-* i¥Ja!k:M ~tt 439

8.3 Hibernate g-Ji"IJ't 443

8.3.1 ~~ HBM a!k:MJt1tf=1::fiX: POJD--hbm2java 444

8.3.2 ;fi~ HBM ~M)c1tf:1:nx~i1Ji&:Jjt~L*-Hibemate SchemaExport 446

8.3.3 Hibemate-Extentions E2iMEl 447

8.4 XDoclet-[PJZf; Hibernate t£1iilif-tfi~ 453

8.4.1 :i.E 1j Hibernate-Doclet. 455

8.4.2 1¥; ffl Hibernate-DocIet Tag frtH 456

8.5 I ~ B"J itfflJi!D M 461

.. 9'" Hibernate XDoclet .:liE , 463

9.1 IDEA 463

9.2 Eclipse 464

II' 10 .. Hibernate ~A iBatis _ 1- ••••• 467

10.1 iBatis;fl~ 467

1 0.2 t:k::i!~ 2i7 469

10.2.1 m4b- I t'F 469

10.2.2 ttl]! iBatis ~titlH~~ 469

10.3 iBatis £.fitB 474

10.3.1 iBatis ~G][ 474

10.3.2 iBatis ~liili¥Jl1tt 480

10.4 iBatis i'iJi~Wtt 491

10.4.1 ~m*1f)C ,. 491

10.4.2 Mi1S1JIJ~ 495

10.4.3 i;b:;&jf!!fCM 495

10.4.4 $*~~ " 500

MAf*ttJ Hibernate

7

10.5 iBatis ~ iu 512

10.5.1 iBatis in Spring 512

.. 11" IA~~~ • .pf: 517

11.1 IJt.~fi 517

11.2 Eclipse :~eWDfO~*1~ffl1J1! 522

11.2.1 Eclipse "*~ 522

11.2.2 iTJ;tJ9i §J 524

11.2.3 :H: Eclipse J9i § rp 1m ~ jar -§ 525

11.2.4 :ff Eclipse t:p:iE If Ant 1'3: * 526

'-/.- • r'tlt

11.2.5 lEiJ 1Umt rl'J TestCase 528

11.3 '~.i!Ja i9J1-~~~ 530

... ~ .. 545

Jl!AJJ!ftj Hibernate

----------- .... .. """ .. Jf'c_.~~".." '~,;.;;:,~~ .. ,

!_w.~~J-"Zm~#E11tit~, MVC (Model-View-Control) ft~±mt~tJf~;tt]m.it.:t -~-, M~ 7 fll'Nit1Rt~o MVC J:fJ fi<J M, ilimt~JiJTi~l¥J Model, W'JPT L])_ i~J! ~~*.i2*4~~ Ii JZ ~ =*= If*iR Jg ~ {f (f] tffL71 0 ffff f.f Am 11=:kJ Model m 00 ~ B9 ± ~ tHJJX;, it 12: it fB tJt ~ ~~\ ~~~~~~~~~~~~~~~~~o

Hibernate it:h -1' PX;"~ II3lnA B"J 1# ~)iH[ y,g ~J~ , ~ i# $ f,f !A.M ~ it J~'~Z =*: 1£ 0 1f~r-Jtt, tf&P~7ftza Hibernate 1¥J~3j ~~~ZJW, ~1fJtff5t*X1M=!A.miiitJ:f!t-J-.Llt. ~litiJ M ~itt IT @] W.m , tJ !i! tm ~ A±t!!lfffJ1l Hibernate ~ -nt it l! ~ 1~ tjf trti m 0

4: ~&t ~ 11S!;), r I*J ~ :

• #FAm_~

• ¥.fAmiXit

• ;f.f 0.. ~ 1i it Sj OIR Mapper

II!A~ Hibernate

4 ~l.

imlcJJ12m~~~Utit

l**1f-1' t~~ ~~B<Jf~~, rl41~" ,J<ta 1¥J1~i~ ". i1j -T~~~F1t 1fX'BtEJ<J--gf{

~,~~~.M~~&ffl~~*~~~, &~li~#~n.A~~~&~~mft~., m 1~1f ::k{iLt. ~~ -1':tvt~~ 1* B<Ji!f't~ 3(~ ~ZV 0 :if ~ M iji- ~~ ~ UE., ~ @] -1' *~ ~ ]H~ B'~ 3b *, ff ~~-Jl±; ••••••

§f5t, *~mi~R<J "~~"o

" t.f ~ ". ~ ~ &P Persistence, fij!f!. * iJt , ili ~ ~ re ~!fJIi 1* ff ~Ij PI f!Ii Ef! it 1-t- fm ~ 1i- 9=t m ~mmmo*$~M~~,~~~~~g@ffl,~!fJIi~~~tttt& •• ~.~~1-t-9=t~a iJi~H*1-t-frJ~1i_t1Ju ~ "l1!lIit", ffiJ~~ 1ta<r~J~n~9!IJ*~jjJ.1~#~*~~!fJIi$*7GfiXo

~~,*~~~~m~~~~~.~$B<J.!fJIi~~1t~*~~~~o~f~~ •• ~ #~XMLti!fJli~~mg~~~~~¥~B<Jt.f~~tt*, m5~~~m, R~tt*_t~~ ffJ-¥fi~~ 0

"t.f~" ~ttt~~ll~jWj1f!, }J~~, "t-f~~" Xm~Wl1iiJlJ.M? ~tj,~\~, ,EiJTi~ "~ A~", &.~~~m~.moo~, .~~~~ ••• A~~-~3 •• ~~ ••

(Domain);

~i1, i3:lI! 1f-~~tffi~~J]IHji}aj, {g~tl:miflJ¥-J-" Ii!: " 0

X1 T @fifL~ #E rm ~, fl~ f.f ~ J}j ff~A ~ ~1Z\ ~ PI d> f(.] tllfiX fflHt 0 }J~ ~ l' RdJL ~ 11'] a<J *~~, B~~~~A~7"~AIi!:"EJ<J.~?

~jq:~, {S&iq:~~~·t~OL1f~Ftlll~o

z.JiJT~~~g!JLtB-1' "W:~Ii!:" B"J.~, jij~~ "f-f~m!R"~ "~~.JG", &~. ~.,RmOO~~~~~,m~1f-1'~X1~~B<J~.mOO,~ttf.Mf.f~it~.a<J~ ~o ~*~~~$~ffiX1rm~, ~1'~OO@~W~-1'~~~~~F~a<J~.~~o

)! ~'tff1£ ~, PI ~JMJ.1-1'fij Jf!.1¥J~. OO~JE (00 1-1 ) 0

ifilAi*1::I:1 Hibernate

1.1

5

Transaction

6 ~1.

imfCJ.6SiJ§rtsJm~i9:tt

~rl~~-~~~~~, ~~~I~~,ffl.~~~~I~mm~*o ~T~~«~A~H~«~~mH~~~~~,ftmM*~-~*~ff~~~M.~ 19L ~~ BS ~fi;]Er-J~tJEt {E JSP ~llmijjfciJ~i1JS$; ~#t X':tT~~~~f}]~-&it-,~,~~ ~~tJE, ~*~m~~~ft*~.~~.~~, ~~ll~~~M$.~(~~S~ts~ Action ~)o

JJ~z,_, ~l+~*!1E~, ~S'E!~mi~1¥J "t.f~m" ? pm**,~m*~~-~~~.~"~~~"~~.mOO~{E, ~~~,~~~¥ M:m1~ T ~1m~ ~ it ft-J pg ilx~ 0

ID~~m~~"~~~", x~~~m~*~?

JA M;e: .L =* tal it , Itr!d~: 1f l1:hmfM;r;m, Xl ~ fE -;; 0 ~ {I'J ~ ~ ~U\ @] 1"t ~ 00 JL l' IbJ n! :

1. ~Q*~~B1t1:~it, flfiF:JA JSP jfItirJ Java WebStart Client1, ftfl']l¥J~i1iiit#~ it f~ iil?J ~ S fffl ~ ~ f.JT~ W 0

2. ~*ft*~.~~1:1~it, ID~~.M~it~~~N~.~f.JT.w?

3. ~Q*n£~~1mf#~ 1-tm1M~1: 1 &~ (~QJ!~ti:IiJf~~), JJ~i.., *#E~ 1¥]4~ ~mM~itU*~~(~ffi~~m, ft*~.~)~S$~~~~w?

3?!'\, _tOOJL1'I'~n!I¥J~~tB~~g~X1, ~~~'t~i£ r, t#Am~~IJ~m1f--~~1-to 1£tk1*_t, ~fflilJ~ ffiJltX1 § ~ *#E~~M~~iiit*lf-~~~tX>:t~;;\j~o

*~~~I¥r± ~, #~~!ftttt!1'i;g Hibernate.EX iBatis, ffij~OOIl~~l1:h17t3'fiI¥Jt#0.m~ ~m#, ~~I~1-t~#~~M~, talit-1'~~~.~t#~m&*.~&X~~~., *~~~~#.m-~B~mffll¥J~~o

1 Java WebStart: ~fJava!¥JRich Internet Applicationti;;t\:.Z. - 0 A1*Xt~i-ff~ Je.: http://java.5un.com/productsl javawebstartlindex. jsp

~Afll:f:j Hibernate

1.2 ~~~it 7

Mm.~?~~~~~~~~~£~o~m~m,a~.~~~~mli~~~¥cM mMMft?~*ffl-~~~~~~.~.@~~o

i3:1! 1f --~ Jt!. ~~~tl f 18 tlttc* ~ ~ 00 I~ ~ iPltf M, ~f\m l¥J t;t ~ mtz: T !iJ -- J]j! ttl *~~~: w~~*,.m~~*R~-~$Mf ~.~m~*M-~~~~,~.*$ ~~~~*~~~~,Im~m~~~~l¥J~~~~~*ffi~m~,~~~m~$M~* ~~~~m~~,~~I~k~*~.,~*~~*M~~,Wm*~$~~~~~~* (II.] $n:i1! W ~ ill Xllj iSm 0 T ;liLA.1fJ 7f ~~:$ Jm ~ m:$ * j!~af *.~91 ifjIJJtl, iE 1r R1:ftl!L ttJ~ , ~~-*~~T~*,=*.~T~~~N~~.,-*~**m~7~$~.~~fflfi, ~~~R1~M~*~fflW.~*l¥Jm~,&~~~~¥~$M~~m~~.~~.~~~ ~c

~oo*oo~m*~* •• ~-~~.*~Am.~o *ffl~~~~~~.**~~~~~.*~~,~~~~~rr~~-~~~u~,m -¥Jt ~ ft 1fJ?JTiJUf.J~ ~1r uf~ 0 M.-g.u~~13<. t~l/~ ~ftJ .l; i¥J 7tfi , rqJ fPJ ill tgM1i* ~ !£~ OO~*.c~~-~Aru~~*~~~,MVC.~~~7~~~l¥JMM1r, OO~*~~ ~ ITll En~~* Y-l!J 1*!~ 1'f ~ *5Z$ij Ej ?tl~~.z rBJ Et<J * jilL A 1* l¥Jfft¥m~~ *1'f:IG ~ m 00 *I ~~~~~rrm~~~m~*, * •• re~.~i¥Jrl~m~~~~~.~~~m~c

~~~mi¥J"~."m~~~~-~~.~ml¥J.ft~~oR.~~~N,~ •• ~o m~irtB~~~)t~, "t't.~" ~.ili&m-*.!¥J-~1i*£ i~, ~d>tt**±~ ~ ~Tt't.it Utit8'~ititillffi 3~~~~, {S ft1n~~~~Ij, X1t't.1r~itl¥JrlJJtJt1* lli*~~M., f8¥~1r ~fffl~11t±H~1ftfIl.J, ~11ttf/r~J!~~ i¥J~it, -tEPJf.i~**J!$Wf;rrffJI f'F 0

1t1n~~ 8<J :£-1'*:V:)im ~ B<JlM-g.*~, ffij #~~~~~5(~8<Jt't~~ 0 -fritli¥Jm-&r*:\L J3t. , tt ilu 1: 00 FfTm ~Ij I¥J 7U $$Jm *1l , #~~ ~ IJ\ ~M, * * #&:ff Ii ~IJ ~ 19J_) L!iJf, 1m IJ\ j(

JI!A~1iI Hibemate

8 ;gl.

milQJmJ=§trsJ~~iii.t

$.rtEt<J~~$Jm1±~ IE f!k~TtX_tiE1i, ~~~7U$~F ,paj /F'IIm-m¥~1r8<JmI_l, ~,tfrffr ~~M~*$Jm~#~F~a®~~~.~~.o

iJtirJ "iJiiitt" =¥, J~tllfL8~m_tr, ~J4J[91JB<1:i:~o ::f)i, i3:JE!tt1fJ#~~J!tE ~IT ~45o ?Jfi~ "mitt", JS1I!if!:wtfDli#a/J\;tt¥oo$5(o rOO, ~1fJ:#fI;l.-1'-~iMw.J¥ ~~~~, *~.MM~mm~~~mH~M~~~Wffl~~-1'-M~o

1tJ'c, 1i~-r~fJllJm~:

ftm~~~m-1'-~~*~,1±~~*~~,~1±.~mmffiEt<J.~,~m~~~~ ~~m*~~#ili~¥#m.o~~~~~#mloo~smmffi.m,~~@~¥1'-~B

Et<J~~; ~#.~¥~~~~r.m., ffiX~~~.MililOO1'-~m~ffiM~~ •• o

Jj~~, ;jfjtF1: 7 -1' ~~Et<Jffl f9tl, ~ ~ bMmm ffi9!!E-i} 8'.Jtf~ (~Wijff1J!l9JG~1D~) 0 ~JE ~ -1'- ./J\ it 8'.J J}j fm it! 7C it JJ lFi1tl: !i1lE -5 ~ liEf] 1D ~ J}j ~~ 0 ~ 1fJ~1± ft X1 ~ 1'- J}j f!~ Ef.J::f $I]!~ Crefactor ) i1~~ ~, ~J\! ~ JA fij: A it ~IJlil.ilj ~ ANf ~I_m I¥J --tijQlltM~ 0

public boolean withdraw(String id,String amount) { Connection co~n=null;

Statement statement=null:

try {

Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection( "jdbc:oracle:thin:@dbserver:1521:forum", "MyUserName" ,

"MyPassword"

) ;

String sqlStr =

"Update Member set balance=balance-"

+ amount

+ " where id= I II + id+"''';

statement = conn.createStatement();

return statement.execute(sqlStr);

} catch (ClassNotFoundException e) { e.printStackTrace{);

} catch (SQLException e) {

J!iV...i*Iii Hibemate

1 .2 m~i5H.t 9

}

e.printStackTrace() ; }finally{

if (conn!=null) { try {

if (statement!~null) { try { statement.close() ;

} catch (SQLException e) { e.printStackTrace()i

}

conn.close() ;

} catch (SQLException e) { e.printStackTrace() i

} }

}

return false;

}

~m!~m~~~~~~~~~~-~ftM~~~.~,&~-~a.~~~tt*~ ~~~19~ 0 ~i1:, ~m~11'Jft-Jif':~£: :flUfiiJI;1I~1tB<J~&*iXit#~J_w.f(M1#~m"

_t 00 J:6:f.&: f~ ~~, IN tE xit PJJHffl Java ~f¥ ag JD Be :'f 11 1t ~ 7J\~~ ~lnlJ JJ'i if, ~ ~ if £: -~~mft-J~~o~i1:, MtE~#I~B<JM&*~.,~OOB<J~~mx~~-~~*m~~ ~*~~~~~omili-~.~.,~.~~~~~~B<JfiiX,G~ •• ~.em~~m ~, iJ6'~9B!tr~t&ft-J~······, ~~, 1t-B<J1Jitmt~~i9J?JT1f~Ff !l~d~c&?JT1f;f¥Ffrp~T ~M~~.~ffi*~~, ~*~W~~1f~+~~~~~, W~.~-~~~o

~ff~7J\~~Wi1:~m~,~~H~~,B~&~~~~~m~.~refflP~~WW ~m~~ft*~~~~, ~~ili~ffl-~~.~#~~ •• 1t, ~W~OOB<J~~:

Class. forName (Config. getValue ("JDBC_DRIVER") ) ; conn = DriverManager.getConnection( Config.getValue("DB_URL") ,

Config .getValue ("DB_USER") , Config.getValue("DB_PASSWORD"),

) ;

~tg~~ iJL ffiX1 J]t*B<Jf~~~, ~~-1"/J\/J\ ~&j~Hr.JliffJtE1~*~J!_t:Ltl1JD T ~#E 8<J JJ{h!tt, {S;l!, ~tFffJtJEii$T~?

ft if] 1f}~ te -1'fFl iX , ~n 5J! ~!JIl~ tJEtE tt fft~tl iJ.t ~ B<J J£~:£ ¥tz JIJ ~it mt;f., ~~rt tt *~~~~~,m~.~*m.M_~~~~*~.~~~B<J*~~e~hoOO~~~~ Jt~ (R. , .L ffi ft-J f~ ~ ~ 1m {iiI ~J1I! .•..•.

JI!A~ Hibernate

10 ~1. (6j1Ql.6SZffl~m~l9i.t

£~, ~FPX/@,Z.J6, f~~ 9:l1fJxR1~t5t~tT1f IDE, ~ 1Eij!t&-e-tltl¥Jf{~P-fii~1·t ~~ , fGJJX: M.~im Jf a tlng tJt ~:i!1i !¥] 1~ ~1?J1~ i:& 0 ~ ix ~p 1~ ~ .1IM!¥]:Wrf fi1-tE. ~ ~ 1( 1'- JG' DrL -T£1fT~~I¥J~*:

public class DBHelper {

public static Connection getConnection() {

! / .M.4t {H; itAi: ~ .p R~4t..tJk t+i!.** ~ ~

}

public static void releaseConnection(Connection conn) {

/ / ~~1t ft] .:t * il9 ~t n-)$. i!Ai-ii @] It ~ l! Ji ~

}

}

public class M:yDBPersistence {

public boolean withdraw(String cardNo, String amount) {

connection conn=null; try{

Conn = DBHelper.getConnection() i

}finally{ DBHelper.releaseConnection(conn) ; }

}

}

ttlno-1'- DB Helper ~, jjJ1~"JJEI¥J static 11ft. getConnection fO releaseConnection 7~ JJXpjf:ff JA~ Ii ff~ flCiiE t1t ~/:1C efl i! It (f.J {f * 0

~m~~m.~B~*ftM.~~~*.H*o~~m~~I¥J.~tt~~,~ffifiM~ 1~ irJ 7 mft , ~p ifZ J6 ft 11'] $ ~ ~ ix£ &~1J.S J$:li~. t'F I¥J ~ IJt, ill R if: ~~ T DB Helper

~&!J{~~, ~**~PX;~o

_§_ it , 1~ :E .

M~~~j:fT:JtB~r 4;:, 1t!iit::k ~fl*:#W~ 1*iffi, ftfr'ltt!fg iiWtJltj:T {t a

JAJ::OOjS 1'-f9tl r, ftir'JrlJ ~~trJ, -1'-fiWt-f ~~ )Jdli@:M1B'-J~~~JJtlE{E~74JffJ3lf 00 (a] iJt it s<J ,~, f~~ ~ 0 @]'tl MOO ~.¥!J rrl¥JMm fi ,~,~~, tE M~;f:iZ 1'~19~ rp, ftifJ Bt{:hX:J)J a<J1Gpx7Wj~M~iltlf¥, tEm~~tV~~~:i!tJ:ftc~f1-L\~)~*~r¥=±1*ffi*(!lJj, ~=!Y!JlIJ #t~~ P-tJi m I¥J ~.ijXuf¥ Sj ± 1*t§)1- 7fj a 1R~ j3: 1'-~ ~ l¥J u*-~jf f~fi9f{, f!l ~ r?: # IJl 7 4X #N*m.~~~, ~OOftm.~m-~~~.~~~m~I¥J~**ff~Mo

RAf*f:I:f Hibernate

1.2 ~~iitt 11

~#*~~~~rl~~, m~T~*mOO~~*moo~«~~~~~c~~~.~~ ~~~~~.~ffi@~.M~*~fi.,&~lli~~~ft*~.o~~-~ft*~~W~, ~~liJf1tffJ § fiFH:1J~~~*~1jt~~, ft*~.tttt£*!Jt~!JJtB<JftJL' 0 .tltH1, :m~~ ~.~.~~~~.ffi* •• ~1J.~c

~*~.~~M~~~.~*., .~£~~~(m~ili~.WaftA~~~~~) m:£ Windows f*1'F*~ q:t, ~1llit~~1t ~)cftff*ft~?ti'i!i, ~ifJfJ;~-~ftflm:xftf, R 1m ~ ~~ ~Jt:t f4~Z9J ilJ 0 ~~1sL ~ tIP iiI, ffij l' 1Z'* IL'~J1JiHIVlllfufilIi , fj~ .l; l¥J lI}j~Jfu&l ~ * Wl {ii]" §i9J, ~Q{PJ ij;;~ e ~ illWt~flifiSWdt~ ~~* ~7t.PJf**~~ ffij a ~ ~tlt!Il:, IJtifJ/f' ~ IL\Qf~ ~Il f~ lE ff, ;f!t ff] ~ IL' l¥J R ~ itt ff] B<J "~*~.", t!pre~ l' x f4 ~ ~ JIJ :Jlfi'J fiJT M m~~.c~*~~~, ~n~mn,~~*~.~~~Mftq:t,am@~.~~*~. ~~~m~~~~~~w,w~w, ~~~~~~~,~@.~ilim~*~.~~c

Ji ii ~ ttf ffJ ~it ~ l!~iUi!i MJ !:=j ~ JI~ ftJ ~?t i'i!i 0 ~lI!JiJTiW ffJ 4n Jlta MJ * ~~1~ tJt ~)( .l; E(.Hj!{tfii~, ffij ~mft1nJi)fx~flitljB<1~!Jt~oo, W1~~li:~~~ 00

~EftJ, illiq:#~~7t~7C~~1t~, tm!l1!t1n!!~, ::kt:iJ£ E-mail ~~J!.~2, iJiffii'~~ 1fJB<J ~#Ejj*}f:;ftX1 SQL Server Ttit, J~:(fiWi~ JA SQL Server i1f$~lj Oracle, ~1: T M: ~~~~~.,m~o~~~~~~~~~~~~~,~~m~~~.~D,MS~~~ Jmi 00 1W mJ JI) ~ ftj: ...... , }[ ~1J;f t!J ¥-Ii :Jt , ~ 1t +E S 0

1ffi~, Wt.}f:;jjJ~~1t~~1Jrnj, :tm*EPJffg1t~H~~1t, # _§J~ftfftiq:, ~ffJmt$ ~~ffl~~~~.~*~~~ftm~~~~.H*,~~~~~~~~~ftm~ft*~. f§~}lI; 0

§~R~-~,~~~~~~~.N~,~ •• ~~~m~~~~.~c-~~~~ MEf.JM=~~~JJL eplIM Oracle tJJ~flj MySql.~J¥, ill~~i]jj8tkmlEi¥J1~~~1! (~

I Orac1eCEO

JJ!A~ Hibemate

12 ~1. mnlQJ&zmS'SJ~~liit

~, 1itrtltl!~ ~j~ffl xtm~~ Oracle Jififlt{)tft{J~1fJjJff~, 9l~, 'Ii ij~ml~7C tmi«~rx:~ W ~ j:.w ne:[:tm fffiittfj] lIP PI ~l~), tE* 45 ~ JJ5 $ $ 7t , l!t11'J Wt m l2.t~ JIj~ ~ ag ~ iJtl 0

public BigDecimal calcAmount(String customerID,BigDecimal amount) {

connection conn = DBHelper. getConnection ( ) i / I-«~ • .il~l!.:tl

I / tt.ff:.t.? f"iJi

PreparedStatement stmt_customer

= conn.prepareStatement( "SELECT LEVEL FROM CUSTOMER" + II WHERE I D . = ?") i

stmt_customer.setString(l, custornerID):

ResultSet rset_customer= stmt_customer.executeQuery();

if (rset_customer.next(» {

int customerLevel = rset_customer.getlnt(l};

/ / ~~.tr.tJftt.*

PreparedStatement stmt_promotion

= conn.prepareStaternent( "SELECT RATIO FROM PROMOTION n + "WHERE CUST_LEVEL = ? .. ) i

stmt_promotion.setInt(l, customerLevel}i

ResultSet rset_promotion

= stmt_promotion.executeQuery():

double ratio=l;

if (rset_promotion.next(» {

ratio = rset_promotion.getDouble(l);

}

amount = arnount.multiply{new BigDecimal(ratio»;

PreparedStatement stmt_updateCustomer = conn.prepareStatement(

"UPDATE CUSTOMER SET SUM_AMOUNT = SUM_AMOUNT + ? " + "WHERE ID = ?");

stmt_updateCustomer.setDouble{l, amount.doubleValue(»; strnt_updateCustomer.setString(2, customerID);

stmt updateCustomer.executeUpdate();

RA~ Hibemate

1.2 r6?Jiii5H.t 13

stmt_updateCustomer.close() i

stmt_promotion.close(); rset_prornotion.close()i

}

rset_customer.close() ; stmt_customer.close(};

return amount;

}

PI t?J.~ilj (~*1~~*x/~\I#J~:tmJJtffBtfB<J1~Wffij.1~jl~Eilj.tlt;tt! &~*, )~Ji1~~ flt* ff,}t ri 11". ff~ iJ: il-ur jfij .~\ 00 ij; ) , _t 1Iff )~Ji 19tJ ~ ~, _§)F it1~ ~ * ~ J9t .~O fOr, Jt fa] nE ~~~.~W~~~~~*m.~~~~~A~.,~.~~~m~~~~~,~~*ili 7Crt-~&~ iliJt ~ fj~ a<J~*Ji~o

~~_t, ~~~~%~7~~a<J~*~~~.:

1. ~t1iSt;p ID l{ltti~p ~lW~~ (flJmH~:~iI~PWG VIP 1S:P)o

2. ~m~p~~~~1T1JTbt$o

3 .•• a~.X1T1JT~*~~~~~M~~o

4 .• *~~~~#~~.~~~p.*m~~¥~o

m~~~*~.~ •• ~~~~.*~~tt7am~.d,.m~~~~~~~~~ ~~.~~~~«~~~Wlli-~*.~.Ao

~~M~~,amOO~B<J~~~** •• ~~OOB<J~~m •• ~,~£,~*~*ffl ~~~~~~~~rr,MT-~~.§*7T~~~~+~~*~a~~*M~W~,~ ~~~~~~B€~m~**.*~m~o

J9 7fKlj{-~-tfciJ~, ftffJ51A 7 DAO(Data Access Object)mA. DAO mj\~~~J:!!

W3 -1'mJ:tl¥-Jt.fl:g., liP Data Accessor tl~lO Active Domain Object m~, It ~ Data Accessor mit ;9;f,W, 7 fiMijj ,bl fiJ~ *~.I¥-J 11-. , ffij Active Domain Object m~ ~f_W. 7 ~ *~Wf a<J X>J~1ttf~, -fNftffJ~l!j1ij~mj\m.g-1tm, l2SlJ!t, ~~JIJiKlft;~., i!H!:#flttF~ IRJ -1'-±~1Jll~1~jH1 0 00 1-2 Jft~7 DAD m~B<J;9;fJ\!J~{i:o

DAOmA~fi~~*~~~~M~~~~D, ~~7~r§~:

il!AMfff Hibernate

14 .1. [ij1QJ'&'vF§B9~~i£!it

L

select.insert.update

2.

DAG

:f~:f: ~!r~ t. (:5~ ~ J PI

3 . J!It;faiM] & a<Jit

:tE~WiJ:$fYkfF 1~$[

DAO :f~A~l)rWi ::k

(Statement Cache; Data

JR)\MU:fJ Hfbernate

1.2 ~iii.t IS

~~~m~~tt~*~~m~-~*.m~)~~*~m,ttttm~~~M~m.~~~ l¥J't1H5L r, :* ~M Jl~ ff- ~tJt 1'1 "~ 0

4. tiJJi!i 1m.

tEll~~T JDBe OOffl agft~ 9=t, ~~ 9l OOX1~ti:jgtt{t~~tt3fj{J RecordSet ~11i!i., ~~~~~ ••• ~~.m~.~mg,m~~~*~.*~tl~W~,~~~w~~~ ~~ Ef.Jff9:~~11it~:(£~ A'*.{io

DAOmA~U~~m~m~M~, ~~~mm~-~OO~~~~~D, ~m~~~ m7f;&A9:!1lJl;J.OO[PJ~*~ag~1*lttfftAiHi1bo iljii]IA DAO fl~, ~*~.J!:JJo~Bti, ~af%.~~.~tt, ~~~amoo.~.*.*~~~o~., ~~*m.rl Customer.getN arne 11 ~ ~ ~ ~ P tIf ~, ffi X1 T ]I:Jt Ji i1 SQL m 1i] ifj fOJ ~ ~ ~ 11.. # JA ResultSet ~ !1t~~~ f rq.~ ¥li ffif ~ , 1lJI#1J A1!}JQ ~ -T ~*~. (f] m .1t~ mJ;i~ 1t ?

~ ~ iik ~ Jt~ 1m it [SJ ~ ¥9: ft.z,. fftflL fit if] 1ffl~:if ~rJ I¥J ~ilrtillZ ffl W:itmxtzJ§, fjt if] IY-J ft~~.~~ff~a~,*~~nX1w:***~«~~m~mo~OOfta~* •• $OO~ ~m~@fflDAO.~~ff~att&.~J§~~*:

public BigDecimal calCAffiount(String customerID,BigDecimal amount) {

I dtt.t%-$.r ID~~$.i' ie.~

Customer customer = CustomerDAO.getCustomer(customerID);

I 11ttti-$.r ~~.ft~.tr.tJf~,Q!tJ

Promotion promotion = PromotionDAO.getPromotion(customer.getLevel() ~;

I / .'- lY.~ r .~ itlf f' ., *~,.ff ~ it It *-

customer.setSurnAmount(customer.getSumAmount().add(amount) ); CustomerDAO. save (customer) ;

I /.it tro .:lr ~Jf fa" ~ ...

return amount.multiply(promotion.getRatio()) i

}

ffi~-T~-aft~,~~~ft~mfflB~~.~~,~.~-TM~~~~~*~~~ *#lli PI l;J.$£t~I#J~o

JAJ:Itii!li1~Wr:pt ft1fJPJl2J~fU, JIM DAD mAX1~l'flm~#J!rrMMt, ~1fJ

)

~~*mm~7~~~w~~~m~~, ~*m~~~~*~~ffi~~~.~~~.~t

~~~T~*~.H~A~(~&BB~~T~*~.~ft~OO~~)@~,OOM~~-

JIV..~ Hlbemate

16 ~l.

imlQJmm~~~l5tit

~~~~~~~.~m~~oft*m~*~®M~~~~~~m.o

DAO m~~, ~~f-$ijjfl:ll~~fJY.llt~.~1J Data Accessor ~, lWooi~rl, DAO m~~ ~y.J:~W31'-mJtB<Jm-€l, lIP Data Accessor ,fO Domain Object mAo

fiiJiW Data Accessor? IlP#ffi1«iJJ IPJ fI<J~!~mffitl:ho I;JM~, !=jf{1«l¥Jftffl~~*11St~, JA"Hll3*:ti-, Data Accessor ti!itt 7 ~:a:A1¥Jf.l$(§fi1&~ n,

Domain Object J)!1j~-m 7 X1wroo~@i~pgX1.IY-JM~"

M~#~5Ct., Rfr'J~l;JiK~l_If8¥:

Data Accessor Object (DAO) = Data + Accessor + domain Object

~1'-~~§ft~~, ~j!.~m~7~rr~~~31'-~~"

~~, X1~J:OO~~~, *~~ft*m€m~.B<J~~~~: ~~,~am~1'-rr.nm~ •• ~ft*Mfi~,~&7~1'-ft*X1., M3~X1.

Customer, f01JE m ne9lIJl-tj!. Promotion" § fi.t, lXWf 1'- X1it -tBttJJX~ T J!tft *@!~ (Business Domain) ~ I¥J Domain Object, mi~ Domain Object, raJ~*iJt=~~X1@i~~ (Domain) W ,& Bf.J ft1'-~mX>fj!., &Jl~flJ1~iij, tt~-1"Wff~~Jj6tt(f] getter, setter 1J~1¥J Java Class

(Java Bean) COO 1-3)0

cuato ..


sumAmourt : BigDedma
Ievet : itt
id·n..:...-
• .;IVM"" ratio : BigDeCi

m1~ *.nffl~~U~~~~*~~~~.

I;t Customer ,fO CustomerDAO ~19tl, ~l_if-t~:rurf (Promotion fO PromotionDAO I¥J~ f~f~~~!=j !lt~1~):

/**

package net.xiaxin.lab.persistence.domainj import java.rnath.BigDecimalj

iJV\fJtIiJ Hibernate

1.2 ~~iitt

17

*Domain Object *@author Xiaxin */

public class Customer {

private String id; private int level:

private BigDecimal sumAmounti

/** *@return */

public String getId() { return id;

}

/** *@return */

public int getLevel() { return level;

}

/**

*@param string */

public void setId(String string) {

id == string;

}

/** *@param i */

public void setLevel(int i) { level = 1;

}

/**

* @return */

public BigDecimal getSumAmount() { return sumAmount:

}

/**

*@param decimal */

public void setSumAmount(BigDecimal decimal) {

sumAmount = decimal:

}

}

NA~ Hibemate

18

~l. rmP.JA2~~~~iitt

ffii ~ X1 i! iJJ31' Domain Object, fJG in ~ f_w. 7 M fSY_ B<J Data Accessor:

package net.xiaxin.lab.persistence.dao;

import java.rnath.BigDecimal; import java.sql.Connectioni

import java.sql.PreparedStaternent; import java.sql.ResultSet;

import java.sql.SQLException;

import net.xiaxin.lab.persistence.dornain.Customer; import net.xiaxin.lab.utils.DBHelperi

public class CustomerDAO {

/** Get the Customer record with specified ID *@param id

*@return Customer Record */

public static Customer getCustomer(String id) {

Customer customer = null;

Connection conn = null;

ResultSet rset_customer = null; PreparedStatement stmt_customer = null;

try {

conn = DBHelper.getConnection(); stmt_customer = conn.prepareStatement(

"SELECT LEVEL,SUMAMOUNT FROM CUSTOMER" + "WHERE ID = "}; stmt_customer.setString(l, id);

rset_custorner = stmt_custorner.executeQuery();

if (rset_customer.next(») { customer = new Customer(); customer.setld(id) j

int level = rset_customer.getlnt(l);

double sumArnount = rset_custorner.getDouble(2);

custorner.setLevel(level); customer.setSumArnount(new BigDecimal(sumAmount));

}

} catch (SQLException e) {

e.printStackTrace() ;

} finally {

A!A~ Hibemate

" __ ~, '~;·~"':~-,:!!~Ctjo.,·;-.·'··

19

/ /ff:~t 1fif, if (conn != null) {

if (rset_customer != null) { try { rset_customer.close()i } catch (SQLException e) { e.printStackTrace() i

}

}

if (stmt_customer != null) { try { stmt_customer.close()i } catch (SQLException e) { e.printStackTrace()i

}

}

try { conn.close();

} catch (SQLException e) { e.printStackTrace();

}

}

}

return customer;

}

/** Update the specified Customer record *@param customer

*/

public static void save(Customer customer) {

Connection conn = null;

ResultSet rset_customer = null; PreparedStatement stmt_customer = null;

try {

/ / ~Af$.i'-f91

conn = DBHelper.getConnection{}; strnt_customer =:

conn.prepareStatement(

"UPDATE CUSTOMER SET SUM_AMOUNT = SUM_AMOUNT + ? "

+ "WHERE ID = ?");

stmt_customer.setDouble( I,

customer.getSumAmount(} .doubleValue()); stmt_customer.setString(2, customer.getId()

) ;

stmt_customer,executeUpdate() ;

} catch (SQLException e) {

RA~ Hibernate

20 ~l.

(8jrc.JmF@9'SJ~~iitt

e.printStackTrace() i

} finally {

I / -ttit 1t l+if (conn != null) {

if (rset_customer != null) { try { rset_customer.close() i } catch (SQLException e) { e.print8tackTrace() ;

}

}

if (stmt_customer != null) { try { strnt_customer.close(); } catch (SQLException e) { e.printStackTrace() ;

}

}

try { conn.close() i

} catch (SQLException e) { e.printStackTrace() ;

}

}

}

} }

1 .2.1 .5 DAO IIltBgll-:!I7a!1I

_t iif I¥JfjlJ ~ cp ~ ffJiiii DAO mA ;9;f.m T ~ *~. ~ fl~ i2~ tfJ 7t. 0 .t-j- T~ J91ft 1l:. (~~~~~~~~~~~~~*~~)W~,~n~*.~*~~$B~~~~~H~M m~ft*~oo~~mmOO~ffi~~~, #~~~~.~tt~~~~~tt~~~~M~~.c

~w,~~-~~£~~~*~~W~, §~~~~~rumB~~o~~~~W~OO ~~~§W~,~#~£tttt.~~~~~~~~~~~$.o-~A~.~.~~£~ i-Q:±i~~E, ~1-rfjjftit!i~~1f~"~~W~1£pX;-T ~7.f1-~15J 8"J~~~!i~" ilRfl\, fET Java ~tlffJI,J~~?JxM=, !t1fJtE~tp*¥JEzra]j(~ l;1.t:££iff$, {B{£~7'~-l'~rni, ~~~m, ~p'fJJf&oorfffi~fEtli:f$l¥JiJ:iio ~?PJff~Bg£~~ 7 Oracle, SQLServer, Sybase WG1fjl; ~~~~tiMWo~ •• ~.afl~~~~~ft$.{£~~~~_t,~n.~~p~~~o

X1r ft1fJf~1fl¥Jiiit W ~, :tJ 7 ~JE ~ ~ ~ F !¥.J1rW*, i!G 1r'JPJ g.t ~fJ\1 it ~:::t: ~~ ~ fl1~

RA~tf:J Hibernate

1.2 ~iii.t 21

%f~ Data Accessor, *~!@i~p ~j),jfffl:WIFJjt, Jiii~Jtf!fIY-Jr¥~*~*~l.w.o ~~, i3:ff ~~m~~~oo~*.~P~.~~$:w~m~,~***~$.~.~I~~.~~.~ 't~L @Hl-~ "7f~Jj~J!IJ (Open-Close Principle) I" -X11tr&7f~, ~1~l&M~o !tin

@~*IN~~~-,&it, ~11t~~.#1*i¥J1f:Z;JJ (~I¥Jr¥~~~) mfi~*#tzJf~o

~7~~"~.W~~8M,d~1t.H*~.~7~~~~~.~~m~~~~~ iNcFm~, ~1n$~1:E §1ltrsg DAD ~~IA Factory m~~ Proxy ~~o

~mmmi¥J~~B!@iW~m~,~M7~~ •• $*~i¥JW~~~t~~&~mTM~ ~-.~%fi¥J~~ijj flllm$Ul¥J~~o 19dtm!lt1fJ(B~~$:I-{£/J\~p lfmr:r, PJij~*ffl T ~T JDBC i¥J~1_m, ffijtE1t:~~~ij~$:I-~ t 1lJ~*ffl CMP fl:~fl~i}j Ibl8<JJ(Em~ij!.t ~~ ffl~~*:H~tft_ti¥J1ifj~11t~ (CMP A1*~~iIffffl=j~lHf, i3:!I!fg _§_:#fJtff:~--t-lIEB)o

-c} Factory ait99slA

El3r$~ttM~raJi¥J.;f1;SJ~HjilE]m1fitl7tj}IJ~.e- §~*i¥J Data Accessor ~l~, §~!tffJ~ ~¥ljiMu: Java Interface ~J(--t-~ffl1l[), ~,5ttM:i!-t-~ffl1t[)~I.w.~~fli1.S$e<J Data Accessor 0 i!:ii~~rJfP~ifijffl3'foo~~lJ~J~m:, JtintftPJ~jft~'f~~r:pX1A1*~l_w.I¥Jf&~o

X1rf9~~q:. i¥J CustomerDAO ffij~, Jt1fJPJ ~lffi~tfj ~lrrlY-J1l u,

public Customer getCustomer(String custID);

public interface CustomerDAO {

public void save(Customer customer);

}

~m1'F~~f9tlt ~~TWj-t-~lJJi!., ~1'-~-T MySqllii@iW, -1'-~T Oracle, x-t~l1!

I¥J faj 1ft ~-Wtlffij ~, ~r Oracle fQ MySql i¥J ~JJt*liff it ~;teA I~JJfJ, R ~ 1;] T ~ ~ ~ #t 1)titl¥J~:#J(OO 1-4)0

';:X: T 7f ffi ~ V!IJ , l1i~ £http://www.objectmentor.com/resourceslarticlesfocp.pdf

JJ!A~ Hibemate

22 ~1.

imloJfiSn~mJ~~i5H.t

:~:cusmmer

r -~ .,__---- ... ..,_--.------- .... - - .... ~ ---

.. "_ .",J~_on.a.

,

: +9dC~! CU5IJ;Jmer

:... .

1111-4 .T::{'~ftJi~~~JR

11: :~:dl1t ffll¥J €Hlljt~ , Factory m r\ tEJ3:1I!~ JlJ J! ~~ [J _fU ~l~ aq.m~ 11: ffl" jj rl Factory m~, ftfn-ar ~~iIi!iA1*$~1J[]~f§mB<J~jJl, *~!1t~~f1::tJ f!f~ @~ Q I¥J- 1'"~19tl~1Jt~jl* mffffl:

CustomerDAO custDAO= (CustomerDAO)DAOFactory.getDAO(CustomerDAO.class)i

Customer customer = custDAO. getCustomer (customerID) i

jjJi_tmHr-J1-t~~l!til'J~T~~JIJ, Jli1~ DftffJ~A1*tr.J DAO ~!_m~b\f~~tp*. 0 iliSltJli3L ~*~iBiu~ tJiJijfflJt\!m~!JN., A1*l¥J DAD ;9;;~~~~tfj~tE~ffJB<J~ , *f~~~~" ffijJli*~j_l~tEre~)[ftf~1J[]J;l.nc~, z-Jfi DAOFactory.getDAO 1J¥*Ai1~liX: ~c~)[1tf~~~mrftifUtJ)~ftffl a<J~tJt~~~~, ¥filii Java Class l;tJ~1J[].mt~1J[]~J§ is@Q

MffiftIDB<J~W*~*.~¥~M~~~~~,R~~a$.a<J~~~~~~#~m

JE ~ mr *= JfUt-J ;9;J_m~ ep PI o

*'W~ 9=t, ~ Y~$itt~~, m~4Jt{x~ffl~IH~~re~)(f*miJl~ff.r*jJ:&1m:t¥~, *ffl 7 HashMap fl::JiJ DAD t1 ff ~ ~7J'19~ :

1**

* Return a implemetation instance of the specified DAO Interface

public class DAOFactory {

private static HashMap daoMap = null;

JltAi*1::I:J Hibemate

1.2 ~~mt

23

* @return the DAO Implemenation Class Instance */

public static Object getDAO(Class daoInterface) { initial() ;

Object dao = daoMap.get(daoInterface)i

if ( nu Ll e e dao l {

throw new DAOException(

"No 'Implementation found of DAO interface => tI +daoInterface.getName()) ;

}

return dao;

}

/**

* Initial the DAOFactory

* Load DAO Interface and Implementation In daoMap for later use */

public static synchronized void initial() { if (null==daoMap){

daoMap = DAOConf ig .load ( ) ; 1/l'fl:tillifoIj:.'#' tf J)a~DAO~~IG.I.

}

} }

DAOConf ig~ ~m 1 tJi~.I.:i:.1t~lt~.;/]~~, *~lltltJi~I~ +ttf ir? ~ $.:IJp~A~~€r?.ti-O;fg~ £i!.~:

public class DAOConfig {

private static Logger logger = LogManager.getLogger(DAOConfig.class)i

private static final String DAO_CONFIG_FILE = "dao.xml"i private static final String DAO_CONFIG_SECTION = "DAO";

/**

* Load the DAO Interface_Implementation into a HashMap * @return

*/

public static synchronized HashMap load() { HashMap map = new HashMap{);

JFigLocator jfigLocator = new JFigLocator(DAO_CONFIG_FILE); JFigIF daoConfig = JFig.getInstance(jfigLocator) i Properties prop =

daoConfig.getSectionAsProperties(DAO_CONFIG_SECTION);

Enumeration enumSection = prop.keys(); while (enumSection.hasMoreElements()) {

String daoIface = (String)enurnSection.nextElement() i

JIlAitf11 Hlbemate

24

~l. MiiIQlfi2~~~iii.t

String daolmpl = prop.getProperty{daolface);

try {

Class iface = ClassTooIKit.loadClass(daolface) Class impl = ClassTooIKit.loadClass(daolmpl)

I I~.fl. 0 it 39 HashMap-t 51, ~JJt~it;l;l.t

map.put(iface,impl) ;

} catch (ClassNotFoundException e) { logger.debug{"No Class Found => "+e);

}

} II while enumSection return map;

} }

- -t iF -iflJ t'ie..I. i:. 1+ ~11 "F :

<?xml version="1.0" encoding="UTF-8t1?> <configuration>

<section name="DAO">

<entry key = "net.xiaxin.lab.persistence.dao.iface.CustomerDAO" value="net.xiaxin.lab.persistence.dao.impl.CustomerDAOImp_Mysql" I>

<entry key = "net .xiaxin . lab. persistence. dao. i face. PromotionDAO" value="net.xiaxin.lab.persistence.dao.impl.PromotionDAOImp_Mysql" I>

</section> </configuration>

DAOConfig 9=' 1tffl7 JFig ~~ XML nc~)[ ftj: (dao.xm/) 0 :X:r JFig l¥J A1*fg 1m i~ ~ J[ http://jfig.sourceforge.neto

ClassToolKit.loadClass 1J~~J~ T~)Cf48<Ji;I]~j]D.:

public class ClassToolKit {

public static Class loadClass(String className) throws ClassNotFoundException {

Class cIs = null;

try {

! I -t ;t~~}f] ~ "f.rClassLoaderho'-.

cls =Thread.currentThread() .getContextClassLoader().loadClass(className)i } catch (Exception e) { e.printStackTrace();

}

if ( c l s = = null) {

! l-ia*-:i!.i± ~ lltClassLoaderhoi\!k.lt., -1t..m ~ttClassLoadernu~ cIs = Class.forName(className);

}

return cIs;

} }

RA~fiJ Hibernate

1.2 ~iii.t 2S

i3::f¥ , JI1U:i it lJ ~ ~ JJ\I. ffi 7t jl!!j, 1f ~ -g- D A 0 Factory i9J ~ 1JQ !J: ~ J)! ~ , fit fn ~ J.,tQ. 7 Ji£ ~~~~~~ •• ~~~~~oMW~*~~~~m.~h.~7~Wh~~Mo

~~Ji Factory mj.\I¥J~Ji, ~fnag~*M1~li!liBJt1rr7ffi@ll¥Jf~~:

I / ttt.ti$:i' IDK1~:t.i' ic.~

CustomerDAO customerDAO = (CustomerDAO)DAOFactory.getDAO(CustomerDAO.class); Customer customer = customerDAO.getCustomer(customerID);

public BigDecimal calcAmount (String customerID, BigDecimal amount) {

/ I ttt-ii ~ r -f titt ~.tr ~Jf ~t. *

PromotionDAO promoDAO= (PromotionDAO)DAOFactory.getDAO(PromotionDAO.class) ; Promotion promotion = promoDAO.getPromotion(customer.getLevel() );

/ / ~ it :t. i' ,it, i}!f f tJf, *.t. iJf ~.ti -*

customer.setSumAmount(customer,getSumAmount() . add (amount) ); customerDAO.save(customer);

/ / i.!. m] .tr ~Jf Ai -i-.

return amount.multiply(promotion.getRatio()) i

1~3ftbJJl7-JIt. Bad Smell, ffiX1T~:itl1W1¥J calcAmount 1Jft;., J~Ji1~iIh.m.m~7- Jltf,{ tIiS ijj r'ci] m ~ ~ ~, ~ DAOFactory .getDAO 1J7t ffl~ ffl 0 1if& ff A ~ I¥J ij[ Ell Mf-f '31 A. DAOFactory.getDAO Jifi**IY-JM!lt, 1.8$~~, 7G~ff~~~ij[83, iTagi2:it1Z\~iI~~ ~~*~.~~~m~ttom~~~.~0~~~.~a~Bl¥Jm~~*~-*9:@M ~.m, @R~~~7~.~Ml¥Jm~R*, aIDI¥J~#&-~o

<> Proxyalt99slA

:Jg 7 {~H~ ~ *~ fi!?s ~ M ia, ~ Factory ~j.\ * * l¥J Bad Smell t4~~ tE ~ #tz. ~~ 0 ~ ff] i] 1 A 7 ~lt1mA ~ I¥J Proxy m~ 0

Proxy fl~B<Jtpffl~3iii~~-1-9=JfEi]M (Proxy) , ~__t~ifpJJfHtD ~r~~JJlffim m, :ltf;Fm~J.w.~Ur (00 1-5) 0

RA~ Hibemate

26 ~l. i6i1Qlfi2mOO1~~iii.t

'+

'/

/ / /

r-- __ i _

! IleI&IIjed

, ,

i+

III 1·5 Proxy fllt~~Il~fj!

liM Proxy ~~, ft1r'J1ij~t£~!Jt~ ~~mmzfB]1ttllfuX~t JAffiJ:#JJ::OOlli!lEr'.1 Bad Smell JA~*~~IJ~ 0 5t;;j-fft£u Proxy m~i:&~B'-J~~mf~ii~:

public class DecoupleByDesign {

public BigDecimal calcAmount( String customerID,

BigDecimal amount

)

{

/ /ftl.fJk$jt ID$.A,"$jt i~~

Customer customer = CustomerProxy.getCustomer(customerID);

/ / ftl.fJk $? -f!.l~ ~.tr 4Ji" ~t. '*

Promotion promotion = PromotionProxy.getPromotion(customer.getLevel());

/ / " it g? ,t,~)!j ~:${, *~,f}f tttl.4-

customer.setSumAmount( customer.getSumAmount() .add(amount) ) ;

CustomerProxy. save (customer) :

/ / ii 121.tr 4Jf's~.

return amount.multiply(promotion.getRatio());

} }

iRA»l1iJ Hlbemate

1.2 ~iii.t 27

Bad Smell m:k T, ~*fifftJ(j;:5f?.fJ-rf1t~ia 0 ffij CustomerProxy ~ PromotionProxy 1t1lT Jl:bft~ rJ~? lt~1~ f8iip.:

public class CustomerProxy

/**

* Get Customer Object by Customer ID * @param customerID

* @return

*/

public static Customer getCustomer(String customerID) { CustomerDAO custDAO= (CustomerDAO)DAOFactory.getDAO(CustomerDAO.class)i return custDAO.getCustomer(customerID):

}

/**

* Save Customer Object to DataBase * @param customer

*/

public static void save(Customer customer) { CustomerDAO custDAO= (CustomerDAO)DAOFactory.getDAO(CustomerDAO.class); custDAO.save(customer);

} }

public class PromotionProxy{

/**

* Get Promotion Object by Promotion Level * @param customerID

* @return

*/

public static Promotion getPromotion(int level) { PromotionDAO promoDAO= (PromotionDAO)DAOFactory.getDAO(PromotionDAO.class); return promoDAO.getPrornotion(level);

} }

~J1t, ilJi Factory ~ Proxy ~.it(J{J~ffl, ft1nM~fl(J{J DAD ;flj.\iltrr7&~, tE::f .~ft4~M~tt(J{J~.~,.m7.~~.OO.~~~~~.o

:IlJ§ , iJ:ftff]iiu~OO 3S: 1'" Sequence Diagram fi}.1*~.- ~ t:&ltJ§ tf<J.6X~ «(II 1-6) 0

JIlAI*IiJ Hibernate

28 Ml. imlqjfi2mmJ~~UHt

[~=J':'74 r=71 ~ F:;-'::J

I 1: CaU5erviCe I I I

~'1.1~:~~~~1~~~· ~ f J

11.:::~ I

~.1.l: !Dod !lAO _'''' .... I:b I

! ~ 1 :rJ

~---, I I

fl.2:QiII_~ I I

~ ~ 1 :rJ

- J J J

I I I I

I I I I

r f r r

x~~~ff~@ffl*~, ~x~~.M~~~~~~~ffl"W~T~Am~~, ~~ e<J iffl1fJlfO til It lJlU ~ ~ jt ~ m ~ c

~*~.@m~~~, W%~~~@ffl~.*~ •• ~~.~~ •• W~~~.(~ ~~ftl!JL*faj~l¥J Select ~# Insert/Update i!iU)o X1Ti3:Jtb~A~.l¥Jfij.q!i!.ffff~, tJO~ SQL i~ii]~~1m$*~eg12:it/f:ll:::t*'~ (~mB<J~~, ~$i~iJl !;A&ti:~$7t(K Jft~4), tE%JEi¥JuJ!14If:1jfl', ~ffJ~~tiM$e<Jttflg~*@~"

~~, ~.~~~tt~~~l¥J$~~~~~*~~ •• ~*~, w~m~~~e<J •• ~ m_ iIaj 1i;fJ1. itU 0

~~~~fi~~*~, .~~~~~-~.M, OO~~*~~~ft*~~, ~ffih~ ~Mfi~~~~~-~~*~~*~~~~a~~ili~~~.~,&~~~~.,W~ 1tB~~~m~ ~#t~~*~~i11000 i¥J*~l3ijJ 0

~@~~tttt~~ft~W~fl~~~~~. *#~~~m~~w*~~tt~~~x~. ~~Hibemate

1.2 ~iitt 29

~~ili~~~m?~~~*~~~*~~~~#R~, ~~~ •• ~R*, ~~~~ 1f 1m Jlt I¥J tt fj~ ~Je ?

~fi~~~~k~, £~~~~~~~m$~~~~~OO~z~., ffiT*~Am~ ~~~,~~~~~WW~~~~~-~~~~~m$a~'~~*~~'~T-~~* i",*, ttttif 3 ('x!l1t:

1. i231t iff 3j( ~II: B ~

2. ~~~~*t¥tf.

3. i2~~*~* B i&

3~~.ffi~~~, ~~~~~-~~~~~~~-~~~W~~~rr~*, .mN ~~~ffi,~~~£,-~~*_~~~~~ffl73~1I:~$~~,~T-~.~~~* 1Jrtffff;-, lt~J!~o

~-1JOO, ffiT~zft~~~~~m~t~.~~m~~~~~~~**Tm*~tt ~m~o~*~~~., ~.ffih~~~~~~~* •• fiWffi~tt~~~o~~tt~ ~~~~,.M~~~~.~~~m~~a~,~~*.~.=~ffi~~~Mfi~~~~ ct, ~~7~~~~~~~.~tt.m~o

~oo~~*~~mW~~~~R~.~.~~-~~OO,~~~*~~~.~&~. tft ~ !Jtm1* **1Il ~ ~ IlfIiJ 0

~rt~~~~~~.M, •• w~m~~.*~T*.m1*~~tttt~~~~~.tt .llfIiJo~~,~~tt.~*, ~~oo.~.mm~~.~.~~~.tt~~.~tt.*~ ~~~fto

1 .2.2.1 Connection Pool

~ •• ~~~t~,~~~~*~~+.~~.,~Tro~~~~~~mT, ~*~#t~a.~4~~3~~Smt~~,~~~#~~t.~4.~~~

f!P1£~T3f!t1fJffij-';-, iBiM JDBC ~Jtt~Ii$i!tl~~~1tf.fl}fijiti~M~1Jm, m~-T JDBC Driver *iJt, :iiftfi~W!lJ1f~~-1tf:$.£t~~!fL ~j@i~:i!~~~&~~~fflijll*~ ~fl:j@iWOrl*ftz.rEijm"5L-~ Socket Connection (X1r Type 4l¥J JDBC Driver ITff-';-), j!

JRA~ Hibemate

30 Ml. £mIQJ&zm~~~1:2it

~.~zm,@m.*.~.M$.*HZ~~.~~~~~~~.(.~ffl~W~,~ ~.), ~~, .*WH~~~~~~~~~M, ~~amB~, ~~~.*~~~~~ ~;ii!~lO~t1E:ct~ 0

.~~~~~,~.amR~~.~~rl~~~s~m~,~~ •• ~~~~R,~ ~~mt W~~~~*~~*~~~7M~~~~~o

~.$~~~~.*~e~~~$~.~~.~-~~.~ •• $~., #m*aa ~~$~~~!oclOjS@11J¥!o WlOO 1-7 WY7J\:

interface eo. .cttIMPoDI

m1~ ft.$~~ •• *~~~.

9HllH'f:ffl#IlTi!M getConnection 1JrtJ~JN.i!t1(, 1lffl1G$JI5fIfiict releaseConnection ~~~~~~@,tt~~~a~#~~~~,W~ffi~~~~~~@~, *~~-~~m 1~ ~f ftE 1i- 0

ti:.$)!~¥tt!1i***rOOa\Jf:Jt~:

1. ~~m:ffl

83ffiim%f)!:t1H~~£ffl, jjjf~7~~,€IJ1!, "t&itfti]I®I¥rk.tt~1fmo (£~d> ~~m~~£@~,~-~OO&*m7*~~fr~*~~.tt(.&~~~~~&.~$ rlai a1Jt1~/~ ~ I¥J fl.) 0

2. !l'19Ht-J * tJE tJFiJ@:i!lt ~.w~g~~W~~rlm~,ttttB~m.7~~~.~~~~~~~&fflo~~ ~~~W~~I~~B*~o~T~*~~~~W~,H~~ffl~~mffl~~,~~7~ .~~~~~~~~~rl~oo~oo*m, MW.~7*~~~~@~~o

3. ~(fl~~7tlE¥f&

mf$mffl~*~-~~~I¥J~mm~,m~~ffl~~uti:~~~~~I¥J~~,~~ ~-@m.*mm_.W)!~~I¥J~~, ~~~-@m~~m~~~$.~o

4. ~-~)!*if~, i@~f£i@iWiig;rIiHI

i#!AfJtffJ Hibemate

1.2 ~~iii.t 31

~~~~~~~.~~~~~~~,m@.H~~~~~fflm~&~,~~~~.~ ffl~~oM®.~7* ••• $~~.W~~~lli.OO •• ~~o

-1-:11 /Jvtt ~ ti:~ ~ag~~~:

}

public class DBConnectionPool implements ConnectionPool {

private static Vector pool:

private final int POOL_MAX_SIZE = 20;

/*

* 1t~4t .. 4-it.fi.

* ~ *- ~ ;iff ~ 9=' ;t "T ffl it.ji., 111J .:jf ~ 9=' :l.E - -t- i!. ~, ~ ~Ui. *" 1 jJ1J .,f}f Jt -1- it ~

*/

public synchronized Connection getConnection() throws DBException {

if (pool == null) {

pool = new Vector():

}

connection conn:

if (pool.isEmpty{» {

conn = createConnection();

} else {

int last_idx = pool.size() - 1;

conn = (Connection) pool.get(last_idx); pool.remove(pool.get(last_idx» ;

}

return conn;

}

/*

*~~m~$~~~~~~~~~m~

*

* -t:1J!tff~'ltt~9='j!Al4tJt.~ ~!.!~)iliHi. (POOL_MAX_SIZE) , * ~*-~i±, JJ1H~:I~Hil!.u:

* 1i- YJIJ a 1ro ~ tf ~;J." r *- ~ Jfl */

public synchronized void releaseConnection(Connection conn) {

if (pool.size() > POOL_MAX_SIZE) { try {

conn.close(}:

} catch (SQLException e) { e.printStackTrace() :

} else { pool.add(conn);

}

JJV..fJJtI:J Hlbemate

32 ~1.

fijIQ]JSS1J~ 9'SJ~~iilt

Class.forName("oracle.jdbc.driver.OracleDriver");

}

/**

* ~~~.ti- J+fjc, .l.1t ,t I * ~tt414-i!#:~ tf 1t .f.f~41.:i!#:

*

* @return

* @throws OBException

*'

I

private static Connection createConnection() throws OBException {

Connection conn; try {

conn =

DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:oracle", "personal",

Itpersonallt) ;

return conn;

} catch (ClassNotFoundException eJ { throw new DBException(

ItClassNotFoundException when loading JOBC Driver"

) ;

} catch (SQLException e) { throw new DBException(

"SQLException when loading JOBC Driver"

) ;

}

} }

~OO~«~~$T-~ ••• ~~~M, ~~M.,m~~T, ~OOR£~~~~~ ~~~~~~-~~~o%~~~*~~~~~.~~~,m~~~*oo~,~~~§~

7tJm~iifjJtB*~ I¥J A1*~IJ,Q., ~fn~~i3Ji~~:tE~~~~ffl ~ PJ~tz:~B9liiJIL tt ~ iU , EE -T getConnection 1f¥td~. @] 1¥.J;;l! -~ fffi Ill¥] JDBC Connection, ~~ 9?! 83 r!i ~):j 't1J!, run~~)j18!ttfBifti1ffl:1't close 1J¥!~~~g;D wl1t-=*, J!~x~~~Um:ffl, flUSIlt ~~~m~%~S&o~7M~~~~~, ~~~I¥J~*fi:

1. Decorator mit

2. Dynamic Proxy m:rt

iflAfII:fJ Hibernate

1.2 ~iii.t 33

-¢-- Decorator.it

"Decorator fi~ ~ ± ~ § ~ £~~ffl-1' ~ ~, J! f!f3 ±lit~J ~ -~ X>j~~ tm iT t¥J J}j ff~" 0

~ 1:i] i! n::JA GOF 1c -T iiitflJt a<J!£ A ~ fF «19:itf}t ~- PI ~ ffl iID rtiJ x-t# tt ftf B<J ~~ » --t5~~-T Decorator m~a<Jmj£llifrm*, IlTff~r~~xtt~JJmffl¥o mllfi*ijt:, iftn::JAu~ Decorator ~JjflX1~it.trrM~, fPJlPt~fJ! ~l*1f~~tH [Rj~~D, JAffij~¥lj-1-~T J]t1fX'f~a<J, X'fletff~ D a<J!I~jtt~~o Jt UML :tI~fmr (00 1-8):

: Cf Sf _

1111-8 Decorator .~t¥J UML_it

~T1frJOOJ3lTitita<J Connection '-f$:a<JfciJiL 1:Im~~, itff]1t7t~J~a<J~, fm*ff~iJ:

JDBC Connection t£1A~T close ~fl:lPt §~~ § c:iS@]itllii1.S~itg;rm~, Jj~~m~li:iJmm ~i!l!YJrmM, is j!, JDBC Connection § a.E.ti.\5€~~~~~jm~*,jIfTW 4d~ JAo .LIt1t-t, '1IA Decorator ~~*MtJtjJdnJ3lTOO~l¥JIi:iJJI~~~~.g.~o

1t 7t, ft1fJ i] I A---i'- ConnectiooDecorator ~;

}

public class ConnectionDecorator implements Connection { Connection dbconn;

public ConnectionDecorator(Connection conn} { this.dbconn = conn r //~~hA..ft..".fK..f.J~Connection~lm

/ * ~l:.7;*~it-t~ •• , .-:.1. ~m •• 4-i!.fI.~~i!4J.1t~.'f1

* @see java.sql.Connection#close() */

public void close() throws SQLException {

JIll\~ Hlbemate

34 ~1.

iBilQJJID:~~~~iitt

this.dbconn.close()i

}

/* (non-Javadoc)

* @see java.sql.Connection#commit() */

public void commit() throws SQLException {

this .dbconn.commit (); / /1)IJft) ~J;Fi!AI-~commit;;f~

}

}

-ar~~~IJ, ConnectionDecorator ~~~~-tJ~:~1tA8<J~M$a1J:11n_t 1--1'"7'r7C. ~ ~J~ 7 java.sql.Connection 1J: D, ::fJi*~ #3t1f~J~fffPJ~lIt~ pg~, Jt~fij Jf!.l¥Jre1i¥! ag~fJ\!.~1t~~trM~~~~;H~1¥J Connection ~19tJ, ffif M7'HW*~, ConnectionDecorator ~ ffil gg Connection ~ 1?IJ * i2::ff 1t ~ rR §Jtl, ~ -JJ 't: ffJ ~ Ij. 7 fPJ ~ f¥J tt r=I, X1 :9Hll~ 7 rPJ f¥ ffJ JjJ ij~ ~ ffl 0

§ f;F1&m~, Jmi1~f=fI¥JM~~ !i(;1fJl¥.J ConnectionDecorator x.tT:9r$Ef.J~F¥!l! W-;;, i,mjffl1J~ ~~JiI¥J JDBC Connection ~±ffH~, notE I*JtfjBIJiX1 ConnectionDecorator 8<J1~ 1& , ft 11'HviJiJ ~ ~ f!I3 ±!B a5tJ~ 1f ~JJt, ~ zJ~ 110 if I¥J *ftt :

super (conn) i connPool = pool;

public class PooledConnection extends ConnectionDecorator implements Connection {

private ConnectionPool connPool;

public PooledConnection( ConnectionPool pool, Connection conn)

{

}

/**

* .~close;;t*, *.",*l!.fl.ii trol!.t!~, .1i1 ~Jl1i.u:* Ptl:i!.t! *j

public void close() throws SQLException { connPool.releaseConnection(this.dbconn);

}

}

JJ 7 Bft)-NfS?PooledConnection, ~1tli'-i-~~,f...~DBConnectionPool.

Nl)\~ Hibemate

1 .2 ~~i9:tt 35

qetConnection,preleaseConnection;t*~M~:?t.it :

public synchronized Connection getConnection() throws DBException {

if (pool == null) { pool::: new Vector();

}

connection conn;

if (pool. isEmpty ( » {

conn = createConnection();

} else {

int last_idx ::: pool.size() - 1;

conn = (Connection) pool.get(last_idx); pool.remove(pool.get(last_idx»;

}

return new PooledConnection(this,conn); }

public synchronized void releaseConnection(Connection conn) { if (conn instanceof PooledConnection

I I pool.size() > POOL_MAX_SIZE)

{

try { conn.close() ;

} catch (SQLException e) { e.printStackTrace() i

}

} else {

pool. add (conn) ; }

}

M:H1 f a*fi!wWj!~J§, ifflJffl#.R 1I~~m\ JDBC Connection I¥Jf;FmjfH2d~triJjJffl &~jjJ, JAW~lJl TflMWittf(iti!I¥J:ilf!ij{to fiiJffl¥Jm:~, :&ffJ~~jjJ~~Jffl Decorator m ~X;f DriverManager ~j£tr~f.f:B"Jl&ii, JAffii./J\-ftflmW~f1HtB;9.;JJl~~!1E JDBe !ii13 ~~I¥J~~o~~@B"J •• ~~~~~f.f:I¥J~.~~~fr~~o

JDK!.3 Ni*rr, 1]IA r-#iragi;JJ~~J:lm*tl (Dynamic Proxy), Dynamic Proxy m 1Mjg Java ** 7flH!I¥JEiTWHtJtt~~j], -"fiiifftfn,%t*~~jLoM:iitl Dynamic Proxy fJL1M Nf~_tIDI¥J Ibl~o

{>- Dynamic Proxy .It

Dynamic Proxy Jl JDK 1.3 Jl&*rpifi]IA(fJ-~1~lIm$tlo F~*iJt:, Dynamic Proxy *~ #~~-l'Pm~, R ij~.Jl: Proxy ~A;r¥J-~i;I]~~~1i~t ~tl~ 1 ~~!1f. Proxy fl Jt:tHIR?t, i3:lEff !l:m;tt~~ "Dynamic Proxy m~", *iZ.ffilli1 Dynamic Proxy m$tl~

JI!.ll~ Hibernate

36 ~l.

iliiloJmme'SJfff~iitt

!.W.l¥J Proxy tlP: 0

@1 fU 1: 00 i¥J to] ~, it if] (I{] § f,jd~: 1£ i] I A fl!liS }$ 3t it rtB m iM (f.] Ji¥J 111, 1* fit rose Connection X1 ~H~ I.J IF ~ 0 mnm iIttt Decorator mj:\ ~J>\l. 7 ),3:- ~ f~ , {9 fE -r Decorator m ~~*~!l ~ § f;FX1~~3&~~ 0, Connection ~ IJ *~5I...(t-]1f¥t.fJ:.~, ~1f]it!,R~Jffil(! ~t&, t£ ConnectionDecorator ~~-?k!Jili!~1Jrt, lifr.tRJ!?ififtf(.J~1t;9;IYl, 1B;9;tE~ 14 't® A (t-] I t'F 0

Dynamic Proxy m~mlJ ~M-±tI!fA¥tk 7lll-!'P]fl!o l!i1~JJt~1-mJEJtl Connection ~j!.

I¥J InvocationHandler ~ I.J ~Jl, flt1fJ1lJ I;).:(£ Connection.close li~l&i,lljffl P1:#J-;lt.~, tf I2l-ft if] § cr~JYl (I{] close 1i~:mJt:tf1-t, 11!~ tt;iS f§.¥tl ti::iW ffittt$1S ~ffl l')xIffl, rm::f ~lI~~rf.JQ

roo ~ Connection Handler ~, E~JJt 7 InvocationHandler 1l 0, ~mt Dynamic Proxy ;fJHMEJ'.JfE5C invoke 7J~~.~JYTffftll~.I¥J1J~i,lljf'H~ft, l!1E~fnili1 invoke 11ft. ~tlt close 7J~jf:itttr!it~o

public class ConnectionHandler implements InvocationHandler {

Connection dbconni ConnectionPool pool;

public ConnectionHandler(ConnectionPool connPool) { this.pool ~ connPool;

}

/**

* .:if#) .~1-'tJl.!:Jts~JIUi JtConnect ion * @param conn

* (fretum NJs)t:f~Jl!.J€; ~Connect ion */

public Connection bind(Connection conn) {

this.dbconn = conn;

Connection proxy Conn =

(Connection) Proxy.newProxylnstance( conn.getClass() .getClassLoader()I conn.getClass() .getlnterfaces(), this} ;

return proxyConn;

}

/*

6A~ Hibernate

1.2 ~iitt 37

* /IJlt1f ~ ~1,li}ij 69 ;tii-;{. -Tr II close ";t*

* -:*u,lJ 1JIJmpool. releaseConnection;t*ft JJ ;f;f.i1tclose;t~~.1-\. */

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object obj =null;

I 1-:*u*1)\]m ~,lclose;t*, Jl'Jmpool. releaseConnection~i!-~Jt.":tt if ("close".equals(method.getName())) {

pool.releaseConnection(dbconn) ; }else{

obj = method. invoke (dbconn, args);

}

return obj:

}

}

neil Dynamic Proxy mj.\, !t1fJ1i9 DBConnectionPool.getConnection 1Ji't1B1it7-'¢'VJ' )J'1i91~a:

public synchronized Connection getConnection() throws DBException

{

if (pool == null) {

pool = new Vector();

}

Connection conn;

if (pool.iSEmpty()) {

conn = createConnection();

} else {

int last_idx = pool.size{) - 1:

conn = (Connection) pool.get(last_idx): pool. remove (pool.get (last_idx) );

}

ConnectionHandler connHandler ~ ~ ConnectionHandler(this); return connHandler.bind(conn):

}

1IlA~ Hlbemate

38 ~1. i8i1OJ1§lm~~~Ni.t

:H 1: * fi m P-f:j!1titl! ~JJ\l.1J;{ :p. ill * /f' R;: ~p 'lit jl If.! 0 __t ITif ~ l' mJ itJl&* I¥J ~~¥tB ~JJJl T .£*~~m.R~ft, ~M, ~~ft~&&~m~.~ •• ~~~~~~m~,~~I ~~~~~~~a~~~~~m*w~~~, ~~~~~~*~~~~o

~ffJJ3:£ZfJT~)S1J3:jfu1i*l£qT~Ai~tHt, § ffJ#::f£M~t£J9i § :8l#tx14~~ ~:fiJf ~~a~j!.~m#,W~~~.~ffl~*~~~ffm.~mIM,m~~~~®~xm I;ttt\ 0

-~*4~~W~~~~~~~~A*~fu~OO~W~mM,~M~.~£~.~~ ~m,ffi~ •• ~~E.~~~,~~~~~~~~~~~~~W~(~¥~~m~~~ ~1W~m:i!1T~~tl, WJ*ttl_m~ -Ko-trBJ*mittimo_±$J:j4fJt$Tjf, ~-T~ffJ~ l'raHtJt&~ ~Ii W~~*I! ffiJ ~, ~ll * ill l_miS:~ ~tw ~~ ~ 3&J§ ~ltWi P-f ijj Ibl jf'it L

~r&~1tJOJ ~~1fftX1 ConnectionPooll.l Dllt#tJ!)}Q~OOPJ~(f];g;I.w., /f'i1JJ\1.tfA $ @m.*B~&*.tl~~,m.m7~*~.~w~.~m#,~_*m~~~M.~ ~ffl#~~am~~H~I¥J~~,~M*~.m~~~~~~~a~~£a~~~.,~ ~}j~ tu ~~: ~~ m~1t IJA $e:r 0

§ mr *- $ ~ ~ ffl m~ * ~ ~ B g?!. ~ ~ 7 § cl¥J Ii Ii J!f. ~ 1l ~ ~ IJt, 1£ ~ 1fJ ft m DataSource l¥Jo-tf~f ttttmt B!21tffl7 Ji\ZfflHIl*Bmml¥J.ts~it~rtBm1fitlo Ai*rflfmlJ ~.£~mfflD*.~ •• ~~~~o

-jfu'tf& r, ill f:(£/F ~~m Hli*Br:r $~I¥J~ ~, ftffltB*~ft11'J1¥J~r:I~~f-1' ~~~ •• $~.~~~(~~~ffl ••• OO •• $~.~~~*~.~,~*~~*m ~~@mm* •• ~~~~~~*, ~ft~~~~~~~Ji\Zffl.*B~~.M~.~~ *0 )

• Apache Jakarta Commons OBCP

• Proxool

1.2.2.2 Statement Pool

RA~ Hibernate

1.2 ~iii.t

public void statmentCall() {

connection conn = nUll:

PreparedStaternent strnt = nullj ResultSet rSet = nullj

try {

conn = getConnection();

String strSQL = "select name from user where addr=? ";

strnt = conn.prepareStatement(strSQL);

stmt.setString(l, "Shanghai");

rSet = stmt.executeQuery();

while (rSet.next(» {

System. out .println ("User Name = > " + rSet.getString(l)

) ;

}

} catch (SQLException sqlex) { try {

conn.rollback();

} catch (SQLException e) { e.printStackTrace() ;

}

sqlex.printStackTrace()i } finally {

if (conn != Dull) {

if (rSet 1= null) { try {

rSet. close () i

} catch (SQLException e) { e.printStackTrace():

}

}

if (strnt 1= null) { try {

stmt. close () i

} catch (SQLException e) { e.printStackTrace();

}

}

try { conn.close();

} catch (SQLException sqlex) { sqlex.printStackTrace()i

JIlAfJIIii Hibernate

39

40 ~1.

i§ip.I.W~B'SJ~~iii.t

}

}

}

}

i!u ft:ffl PreparedStatement, t£~* $ ~tM(5t rl-ay ~ 1f ~~ j{ij:m:~ i1J&!w ~ ~ ffl a<J tt ~~ , 1m}l r IWJ - * Update i~iV, R 1f ~ ti: ~ Z;b B"J !tt:i:!ik fF 0

ret~f£1tt:a~fF!fl, PreparedStatement B~}~i~7:jJij, jf1f~n~Jt~1Li:if1"Pttl!1¥J 16\~0Qi? {fi1~¥t~I¥JJl, lltB1ff<J PreparedStatement agltffl&~T PreparedStatement ~{9u1:: 1fit~WL X1f _tOO~1¥ffrro~, stmt {.tffl7C$Z)§~~1Jt~~, r(X!41Tjiij~s<J~~ft-t, PreparedStatement ~~~£~ttJ}t 0

fiM Connection ~{9tlBIJ~ PreparedStatement X1j2.l§~fij.t /Fi:1fij!)is<J~mrf!IJ~. :w ~ ~ a<J ~ll 0 ~ PreparedStatement ~j2. BIJ ~B1, l2:~ P-f~ xtM: ~ PreparedStatement ~ ~sQLmff~~~.,ffi~*fi,~~~~.*~@ffi~a<J~ff*~o

~~I~.~ti:~$f£m~~~~~,~aI~~ •• *ffHM~**~~~tt~* l~, }tJt~ttX1-Jlt,~~1¥J SQL iB-tiJ, ~ 1EJlJt1n~ft.z.~X1 PreparedStatement ittrrtf

ffEB±:~~~o

E8 T ~ A ~ 1£ t. t5L r, PreparedStatement X1 ~ ,g,:J! ~ Jt Btl }! *, tB ~ ~ BIJ It Jlt PreparedStatement X1~l¥J JDBC Connection ~{9tJ*tHnJE, -_§.J1t lDBC Connection ft}C~, JJ~~:1tM BYft-J PreparedStatement &~t&:~* 0

I3Iffff, ft1nl¥.J~{ttlttl!&16\~9i ~ Connection lHm~o 1f~zfii1&J¥~m1tBtfuttll¥.Jt.m. r, X1 ~AA ~ii ~i!1l j1H-r PreparedStatement ~{lP ~:x ~ J!:1tLk , ~ J.J - _§.3!g;~ ~, lltti ~ rtB tB!It § ~ ~~, ITfftE m1! 1t aq 1: -® ~ M ~ PreparedStatement 1fl.~'J:mffl a<J.* tB ~*, ~ Jlt, PreparedStatement tiitPitl!1Z\~m~..g.I2:M~it1lrtftt~~{fffl, j~JFfl~~~~1f-mJU£ m I¥J ~ f1>f, 1ft ji g; z 1i1I 1: fiX tfJ PreparedStatement x& j!.& PJ t;J. ~ J~ £ ffl, iI ~ 7 ~ {x ~ PreparedStatement J1trr~Jlaqttijg7fm e

~!IL tE~ool¥J Connection Pool ~~~ilfjz._t, ~fn~jti]IA Statement Pool mt'L ~mftfn I2l~T Dynamic Proxy fl:rt~J}R.l¥Jf.l~Wii:Jl*B~i1tl (Decorator m~9=t ~~ml2l ~JJA , R fffl m fl: 1~ [~:) 0

I tf~®~~%F~, "W!Postgresql, -fj!fflPreparedStatementPTfm&ffijil;r4f~~tr~*, tm!iJt~~fifmfitJ;tt~~ .,W~~~~~A.~~.~&.ff-@~~.~~

iJ!A~ Hibernate

1.2 ~~iii.t 41

@] tlZ mr JBi jj: Dynamic Proxy m j.\: ~l?! fl M W it 1:t ~m $IJ B<J fJtl ~ ~, '@. * 7 - 1- InvocationHandler ~ rJ B<J ~~ "ConnectionHandler", is:m. !fG in ~j ffl rtU tF B<J Jj)1 , J,ljiifil -1" InvocationHandler ~ D I¥J ~}.m "StatementHandler" %J£X1 PrepareStatement I¥J Z;fj ;i§f-t fJ_, ~;r~~ ConnectionHandler l£ff.a, ~Jt:tlim Statement Pool r}]ff:

public class StatementHandler implements InvocationHandler { PreparedStatement pstmt;

/**

* 4f ro :t~~JtJ.t3Jtt¥JpreparedStatement~'" * @param stmt

* @return

*/

public PreparedStatement bind{PreparedStatement stmt) { this.pstmt = stmt;

PreparedStatement proxyStmt =

(PreparedStaternent) Proxy.newProxylnstance( stmt.getClass{).getClassLoader(), strnt.getClass().getlnterfaces(),

this) ;

return proxyStrnti

}

/**

* Af-itStaternent. close~* */

public Object invoke(Object proxy, Method method, Object(] args)

throws Throwable { Object obj = null;

/ / M-iiiPrepareStatement. close~*

if {! " close" . equals (method .getName ( ) » {

obj = method. invoke (pstmt, args);

}

return obji

}

}

:is:1I! 11=~~{ftl, ~in& (J(. tt~ Connection. prepareStatement(String sql)1i~Jlt1-r 7 !It;JI, X>t-r prepare Statement 1J~~JtftB~ [RJ~f&I¥Jn&*, ~Jl1i~~fP1, i!lI!~/f':P}~i£ 0

§3;r~, ~in1lW~~ ConnectionHandler.invoke "1ii'!:i1HfD:t&, 'ftzltYt prepareStatement 1J#;., :tt1t;M;jS@J-l"~~i:tl;l]~I:Dt~J§ a<J PreparedStatement ~o

I public Object invoke(Object proxy, Method method, Object(] args) I

JIlAI*/:IJ Hlbemate

42 ;r§ 1. milQJmm~~~~t

throws Throwable {

Object obj = null;

if ("close" . equals (method.getName() )) {

pool.releaseConnection(dbconn);

} else if l"prepareStatement".equals(method.getName())) {

String sql = (String) args[O];

I lit Jt.J.,J...Statement~ tf .~~,t_ ~;jfM:.SQL~ filr.J PreparedStatement I I ~111J

obj = stmtPool.get(sql);

if (obj==null) {

1*

* "p*Statement~ tf ;f;.~m.tt f1 fIJ PreparedStatement, 111jlJllJl} * Connection.prepareStatement~*, -€'JJt~aB~

* PreparedSta tment, *~Jt:.#.A~ tf

*1

obj = method. invoke (dbconn, args); stmtPool.put(sql,obj);

}

PreparedStatement pstmt = (PreparedStatement)obj;

I li!.iiStatementHandlern-~j~~PreparedStatement:i!~t.jrUiilEJ StatementHandler stmtHandler = new StatementHandler(); obj = stmtHandler.bind(pstmt) i

} else (

obj = method. invoke (dbconn, args);

}

return obj;

}

1 .3

~IDIOO8<1.lJq:r, f1tffJi-J~ T M=~mi2:ite9-Jfu~*,~\~I;J.&ffJ~~}~1i*o iJ!Ai3: ll-t.~~a<J § 8<1, #~~~7J\~~~ImM*1H~~agi2:itIm~ZJ§@ZJAxjIJ1f~}l § cag~~~m M*~~mm,ffi&,~*$.M~~,~.*~m#~~Xma<J~~;~~~~~~~ *ft-J §~, tETm}~fff.f~mm~EJ<J1!~mtxl¥J.f:!M, JS::m1-JftG1nzJ§fl{]~Jij7fttI fffT

Nl,Aj;f1:tJ Hibernate

1 .3 ~~Jeiii.t!§' CRM 43

r~~8<Jl!~~iiilio

§ 1W, xi~£ 1ftj~@l~~£7fii*±lR, ~ Bt~~~1f].~ T *- -g 1i~t~~~fl{J~~m m#,~ffl~~~.~.~B~~.~~~m*~N~~.tt*~~~~, ~~m~.~ mzm *#t7f~I¥J91zroF ill bto

~~,~~~~~m~I¥J~*~~--~~~m~,~lli~T~&m~tt~I¥J~~~ *, Jt9=t ORM ~~)iH-g~, 9!~£**Ir.l±mto

1.3.1 ORM.~

ORM ~ ~ i3tJ1: § frJ tt~~ B 8<J~~, /WiVJ ORM-Object/Relational Mapper', J.A * 00 __t*J!~, I!P "X1~-:Jt*~lVJJi!i~Mt1l14" 0

-gr5'G*~ OIR, :iis:Jt~~*pij1'-~tliaj: Object (X>j~) fD Rational (**~tij1iS)o tE § fitr!¥1 ~ffl * #t 9=t, * ~ ff~M 1£ r, It 1fJ ~ 16\ ~~ ~ B1 00 X;J X>f~ ~ ~ Jdtl liif8:i1t 17 7f 1t 0

:tE~*i2mm~~:tr-m, ~ffJ~~!Jt t:p a<J"*~ ~ ~1*j£1jOO ~X;J~I¥JM~, 1f~l1t:#f ~~lli~t:p!¥J~.~ff.~~~~, ~*.m*~~~o~~-~OO,~ •• ~~m, ~ f§fitr~M~tt*~.8<J~~, am~~~~~!¥J*.~ •• ~m~__tmff~A~~~a

~ 1'- fciJ f12i § ~ i¥f~, ft 1fJ m ~ ~11 ViI:#f 00 ~ X1~ !¥1t2:it ~ ~#E* * mfI1SJit 17 ~-& ? ~fitrM~"M~*"m~~DAo.~~B1~, ~~~amB~OOX;J~~M~o@~ -rZIDI~Wi~:

DAD ~jtA.~Jf;FJ:.:l.~+~lA.~m~, Up Data Accessor ~lA:fu Active Domain Object ;f:lA, Jt. tF Data Accessor ;f:lA ~ lJ!. 1 ... if fP];fu:It ~ j{~ ~ ~\,. ~, r1Q Active Domain Object ~m 1 .!l1:.~ft.t'%-6?~ #.1t#~~

• ~£iitl:;f):Htm@!~r:paq Object Role Modeling ~1H8:?to :'fj9~tl:.j!mili!J.IHI<]*ilt/1: "OIR Mapper", -Ifii ~ F M: 'it £ s<J •• OIR Mapping" 0 ttl m ~Eijj: , OIR Mapping Wi ~ a<J:& - # i5t it ,~,;J.t!oc 1t ~fJU1l. itIIJ • 1'£ i! - .81:, l=j J:tff]l:dtiJiJT~1¥J "OIR" I¥J~ 5C~~J:-3&o ffij "OIR Mapper" -I&mm~ OIR ~JMi.2:ita<Jtf9-.1-tm~, 1(:11'11 *7~ OIR *MZY~I¥J!l!~F"J~. Wl SQL §-i_r£, $~Htfl, Cache W.£ll!~o

lIlA8IIf:j Hibemate

. ... _,~.-,o.'. . - ...... , .. ,.

44 ~1.

DID Ic.1ASlJ=t3 e'Sl~~l9:lt

tElfUOOl¥J-wtlf-~ t Customer ~, epJiJTi"B"J Domain Class/Object, X1 *tJtq:t I¥J II ffl F" X1~*1TI1mjt!ftto *!1Emtrfi~~, Customer X1.~-WH1:j;J "ffl?" ~1EB~1~~, f7t~ ~ m1CJ 1ft ~ ~ ~ ~-1'1fl ~"

~fl1, 1fIit1nf(.]-*tJE~, ~$~~ Customer ~}t9;1Jtl(J9m,g, t1!.mt~J1TiJiI't-J" fflF fx:3m " itt 1ft-f .?\.'ft t 1* ff irJ fli'i!i ~ l}). ~ B B zffl 0 T Jl t tE1: lID l'flM {j( 1i * ~, fit 11'1 91 A J Data Accessor (J.t11iSiJi ftl]~), ~llX1.¥Ij~*~~W1¥z.fB] 8<Jt# _?.. ito

l:~~it9='t Customer ~gg~ttwLm. ~~~$~~$i.:tra]EttJx1@, iBffX;J! OIR *~ sg-l'~19tl 0

JA~-1'm.~19~ ~ t tEJiJ~~ilj, ~ 7 ~J!M=!A.1tJ[M=, ~11'J1Z\~9t~~X1mrt-J Data Accessor ~~J_w,f1f&~:iflmlJ&~ (CRUD-Create Retrieve Update Delete)" .1m!¥] JDBe 1~ JiI} Xl lbt jf& 3E e

OIR Mapper I¥J lli J~JJ!lJM tk T ~~ fciJ III 0

m~.~~w~~~~~~~~~.~o~~ft.~~m~IDBc~~~~,MW. fjt Pfi ffli I¥J ~ !A it J}j fm "

tfmrOO "M~~J~~~ § ~M:*" -l1l¥J~~-1'~tJIJ~, :&1[,] EJ~tfjIJ Ti3:t¥B<JW~~ o ~*1-t~~~~7~T JDBC fif~tijB9~~1t~J~g

W~, ~~~~I¥JM!A.~~m, ~m •• ~~m~.~, ~OOI~m~o

:i3: ~ m.it ffl tJt .B 1£ -T If 'it 8<J ~J! 1f 1t 0 X1~ J]t ~ ~ #t!.t\! ~ Ij" ~ J5Y. ffl ffij --;; ~ m ~IJ A 1t 5!..0 f.8{t1f]1B~~wftl, £-TMf'PfJtA7fttl¥J~!JE, Jttt iPttl!l1;tJlf:tt *1 & , X1.mitt~ ~~~~~~~~~~H~~~~*~.ft~~~ao

JlAf*f:Jj Hibernate

........ - ... _-----

1.3 ~iii.t.!§' CRM 45

SQL

g

.

,

Business Classes

II) 1-9 ffl.?.~ ~ fI tf.J;1 ~.it

~~~, ~~#.~~, aill#~.m~OO*Milimm"MAm"OO~.m~o

-<} _7 Data Class eg~~Iil~U.it

~M:#.~~, tiJti5~ (Data Class) f1=j;J~*~ ~M~m¥tJiiEt-JfJf~, ~lfff(_l:Ja r-OOfFffl 0

zwrfJTi1i~l¥J DAO ft.it;t{§tl, ~~f.l:¥t~~f'P~.itI¥J-1'-A~~!Jtg Data Class ?t~f.

L ,g * T DAO m~ * a<J Domain ClasS/Object .lO Data Accessor Class 0

Domain Class 11: j;J M!l ~tit 1f- B9 ffb., ~lfffi.m ~ * # a<J 11: ffl 0 rm Data Accessor Class JilIJiiji JDBC 1~i1?J~ Domain Class ~fl~Jf~m*~o

~#.:a:~Q 00 1-10 JiJT7f\ 0

§ SQL
- r= ~
Data Classes ........ g *~~fl~$

Business Classes

II) 1-10 aT Data Class ~~.?.~~IJ!.it

~JS:#.~~, ft1f]3t;J.W. 7~*J!. ~n£m~m~~z.rB]aq*i'l'j 0 Data Class fl:::A1- ~mMa~a<J~.m~,~j;Jm.~~~7mmMA~a<J.~g.m*.fl.a<JM~~~, ~~~~~m~~fl.~~~~~, Mffi~~ML~aq~*~.~~~~o

Jl!AI*fiJ Hibemate

46 ~l.

imlQJ.®J~B51f6~Nit

~~~m~~~MiliBffia~, •• ~#m~~*$t.~.~~~ffi~~~offim .-~m~.~~~,*m~~~~~~*~*~~~,~§~#~H~~*ili~$~~o

.~~IDBC~~~ffl~A~~~,.~~.~~h.*ff~*~~~,~~~~B x1E12)j@~o

JlJf*, ft1r'J::f1!:fJ[~ 1t~o Sun J2EE ~j!m1blJfE/J\~!lI2J,&Jf$i~i*cp!¥JA $ j] it Bf'{:U ~tlEr.Ji*~f'J7i3:-g, -t-£~1n~ff7 Entity Bean .. JDO, Hibernate .. iBatls .. Apache OIB ~!1:t.~tB tr.Jffl7-..mm~ 0 rm~T~lt~JJXf~QJ~ffl~_7Jm~, ft1I'Jf~~JAi5[it·~ ~[{tfi1: ~~~~~~~M~o~~, ~T~OO~.-#~~n~o

~ .T~~~~fi~~~~~_~

3t;~ff.l:, J3:f'Pm.i\~~=#fj!xt~li1$ o Data Classes foJT'E1 *I¥J Data Accessor *11 Domain Class fJ( ii:# 1i ff ~ 0> 0

R~, fJt1i'JreJtt:p~~~lYHt-JlfF-~-r IDBe I¥J OR ~MI1t, ~ffim~='jJtliftf ~}JjGo

Data Accessor 9=Jff.J~lYHj~IftINJlt~~IJ7~M"m11t, ITO ~Jlt~at, 1*~¥f~)iHt!~ rm*ag*mWJIJ{.ili*A~$.£ 7 Domain Class 8<J~~f/J.m 0

i3>ftft ~!Jhl. fJtrt izl1 rn 1-11 JiJT 7J' 0

Data Classes

B usiness Classes

1111-11 ~TJ£flffl~JiH1!~~~Jf~~ *~~±~~~, ~~~~~~~I~~~ffi~~~*o

lfI!A~1:fj Hibernate

1.4 "'~ ••• ~

:(£ Java ttJi8<JfJJ~M-~f ][~i}l!ijm JDBe JL3fJl:ff~$ijj(llltt-J'HE~¥fio ~;gili~* iiit/~,~~~ Java 1i:**~B<Jm1tf tljJl7i'f~ JDBC l¥JM~1i*, ~JIt~*jJfJtifJrfl~H!i ~iJjl'ciJ~~fJ\!.~f~7J!$~~1f, §IDr3::i1rtB<JJLlf JDBC M~m~'§A5: Hibernate, Apache OJB, ilsatis. JDO lZA& J2EE ;@~~rfl eMP ~o i3:~m~lZAVt~ffl1iit**~~7fitliS~ w~m~*~~.,*HmrtMD.W~~3~ •• ~a.rfl.~.~,~~7~~rfltt~o

tEJ:m § 9X;~f=~Wftt~ iJ[ AI5X;~gg~~~fK~~JJ\!., ~1'.IJIJI¥J~1f 0

~1' nX"~ ag M= ~JiHI!~ fl~ jJ ft ffHiYi J1:~ft.z_ ?

• ~d>~~rfl1~~l?J

.~£#~.rflI~tM.AW*~.~~~o ~~~.~*~~~+A~~.~ag~W: ~~~~$~~,~fr~Lm~,*ffi

tij1*)$J!~······l!~fC*, ;¥ix.gIJifittm~8<JI 1tftff:~.-t~fi~i1~o

~~~m~M~7~W$~~~ag*$~~*~~t ~.*~~,~W$~~~~, SQL j:~~o ~'MT~~J£~fjt*B<J~m~JJY.t fitir'JIlJI;J,h\ JDBe ~~ffl~~q:.MmL JA rro :#J m lI'J (j{J fff iJ ,fO glJ:i! 17 N A. IE 1f 1f'r 11I tB I 11: q:t 0

• £ 1J[] 00 rtJ Mji ag l5t it §$~~~~m~,*~mB~.~~OO~M.~R*.~Z~oO~(~~ Rational Mapping) JL3_f~ § WI±mtf-f'?"'JiHI!~rfJ~*~tto

ORM ~ * m 12:it~f~ 71!1J[] § ~ ag ~fJl1i~ 0 !'Gin PI ~ili1 ORM~ ~m ~ aq Domain Object §i;I]~M~tJ~1'~tJiS$*, JAffiHAiU~q:. R 1ffl*/L' Object gg*1l~,.ttf W£fmMi4t11 -F JDBC ResultSet rp~7Cjl,*~~fi~~~o

• £ ~ 8<J '[1: fl~

~~mm~*$.~7tt~~tt~«~m~, ~~~OO •• $~.~~~, PreparedStatement ««. ~~~ff~o ~Jfui1t{.tm1ij~aq~*1t:Jij::k*1R:ft 7 ~#tttff~o £ m ~ Ef.J 1E:, 83 -T iiit 1: £1Jo~ TID Ef{] ~fI (i3: Jfuf,f AJiHE~tt tt If ifM1.~ gg i5tit ~ ~A ) I i! ~ fll. iMX>t-r- l:mftJ ~7G ~J! f!f1, ~1fJ xfffl' ~Jl)Jt rp !l~1¥.l ~~~ 11 lID PI $= ,EffJtPJf1f* a9 '~fI~.ft ([!~Hl~rIDJTIDjC-T~Rmi5titag~W, 1ilJ~.~)o

NAiJiffJ Hibernate

48 ~l.

i§jlQlmmBSJ~~i.ii.t

• J! M Er.J;f$li 'ti

~T Java B"J~~&$ftt, &ir'Jff.J~~jfaJ~:tE~jqJ~fF~t!tzrB]t)H~o tEl El3T~Ii}tf:z. ~B"J~~,~~~ •• $~~~~~ff.W~~Tmho~OO.&~~~~.~~mm., ~T~~k~~M~.,M~.mT~~~ •• $~~M~~taillR~m.~.a~~ ~.~, ~~~~~~~.$~mM(~.~~~~~~m~~~.*~8~~tt, ~ Oracle ff.J PL/SQL) 0

~~am~~~MT •• $z.~~Bm~~~ •• ~,~~.M&~~.§, ~~~ ~~;m1ittm~X1jrJ&7J', JltlPt~F~fjl=B]~tl.t£.~fli~tl¥ (:!JIl HSQL~ McKoD, #{fm~A ~~~M~~.~$W,~~.~~~~.~M~~~(~tttt& •• ~.~~~m~m A©,)

~ u 0

Apache OJB (http://db.apache.org/ojbl ) Cayenne (http://objectstyle.org/cayenne/ )

Jaxor (http://jaxor.sourceforge.net )

Hibernate (http://www.hibernate.org)

iBatis (http://www.iBatis.com ) jRelationalFramework (http://jrf.sourceforge.net) mirage (http://itor.cq2.org/en/oss/mirageltoon) SMYLE (http://'MVW.d~ava.de/smyle/)

TopLink (http://otn.oracle.com/productslias/toplinklindex.html) (Jt~ TopLink;li; Oracle aqifij~f=£, Jt1tBj$J1-J7f~J9! § 0)

jt:~, ~~t£Jgt § 9=t~~j~jJB11¥.J1f Apache OIB .. Hibernate, iBatiso lJiJH1tE01iJt.f ~mm~~~~rt~~, ~ff~~~7~~~~~~B"J~tto

Apache OJB, Hibernate, iBatis ~~~irf711~~IJt1<J~.o

Apache 01B ~~~ If!AAJ9i § (20011f:~) ~m*JJHJ9f#~JiH1!Mo !k~j~rrq:t, DIB

NA~1i:1 Hibernate

~l_mtfj Tf1H1B<Jt'i:ft~lJJ~5E1"i, ~#ttE 1500 1'*~m* .. ~!t 24 IJ'fl1l¥JlliJJ~~iJ\:r1t(~ A -i-~ ~!¥liE 1T an ti 0

Apache OJB !¥l 1ft ~tE -T m ~ f'P f~11E fffJ ~ 00 Ji: ~ (::f fi. ~ .l; , Itt if] B"J ~ tJEWf 1t 9 * /f'$~ ~ 1PtJi:t#i!,z. $fiF1tt, 1ll*~~f~ItB"J*1T~J~:*~iEPX:~ Apache OJB Jm § ali l¥Jm~'E1lfj(), iijtM~-F Apache ~~m~, ~lf~1lag)Jljfi1*i1tlO~JE8<J~Jl3fL!l 0

Hibernate tE 2003 ~*~ JBoss ~!JJRL&~, PX:J>JJAfMr JBoss t1lml¥J~J_m § Z-, ]A ffill\1f} T ~~l¥Jttn€1WjJ: ([iiJa15R~ 101t 2004 ::k~L

Hibernate £j OJB iiit.~,~~fbt, A~f§i'iI¥.JJJJ~lOif~, fS 83TJtJ!1JQ~m~itl¥J ttJ& ~ ~, 1fl fU 7 ) *ti*A ~ !¥J ~1t~ ~, ~ lIt -tB ft JU 7 J!/iZ 1¥J1t * a ~ X>t Apache OJB ill.~ (fl J~ § 7f ttitHt~, Hibernate m ~ f¥J 7f:& m ~ l;J.:&, ~:f± ~ P3 xt jt~ ?!~ I¥J ~ tl: J;; Jt 1t1 * Tf1tkl¥Jffln, *~i$T~JiJJX; Java ~~m$~_ta<Jt~ma

iBatis #Jxt Apache OIB ~ Hibernate Jm § J)!IJ~Atlf~, iBatis *~ TI!1JQ7f1Mi\;~1iit, :iMrl iBatis, f!tirlarl2A~ittl£~~~t@i~ffkfP~lj a t§X&ffi]~, Hibernate .. Apache OJB x-J ~~m~~*~~~Hm,tim~I¥.J~~~M~m~ff7~~M.a<JM.,MW •• mm ~~~~~~~~~.,*~_M~r,*~~m+~~~,~~~I¥.JWf1tW~,Mm~ ~~***7£.I¥J*1t.*~~M~M.m~,@&~~~.~~,~X~-~~~!¥J ~mi,liJj§** 7 ~lifJ, ~Q{Ex-tmm *#Ca<Jt&iiI~X1~ffJiiW$tf.J ~ffl__t, ~fJ¥.ili 9imi1/F JEI¥J~~£a JltBtft:kJ OJB ~ Hibernate J¥J-/j'-ffg1~1C, iBatis e<Jilil!tH~}}rJA.)(a

7.~~-~~Am~~m.,~~~~m~mJ¥J~00~~**.*m~a*~~a 1fJ~:j:~i1 §1WJI:kJ}¥'z'@lm~ Hibernate, ~5'~, tElijtJj{t:pft1fJtB~§3:9~-~~~m~~ iBatis )!ly T ftm a

RAil/:fi Hibernate

iii!

I

n

Hibernate~

1WmH'9~~~, ~1f]~mTM=Rm\iitf;l1 ORM ~Meg~~.~o f1=~-t-it*egt# RJ~H1¥!1tg;~;fJ\L Hibernate JE 7t1*fJY. T mImi P,}fi! eg 1i it Jf 2, :1ftt ~ ~ It-j ~ffl1f ~l£tr T }( .f~1Eo

Hibernate ~fjt751il* .. ~tt~B<J~.JIJ*~~f&~$eg~!AitHll*o ~Jm Hibernate, 7f1tAff!PJl;J.1~Jm Java eg~~mJ( (-E!M~If* .. ~ ... $* .. t!J:€t~& Java eg.1t~f4) :itttr~AJi!7f1tQ Hibernate ~-meg HQL (Hibernate Query Language) ~ifii(ti]X1jll¥JlImJ ~~, ~~~.m~~~~~~.~.~OO~.T-*~ ... ~~ .. ~~l¥J~4~.o

2001 if:*, Hibernate ~-1'iEj_\~*X1~~~~t i!:1'~~fJJ~B9~)L1ifi.\~f.JlJ', ill iJ I *7f~:f±~ 9::q·fl-J1~tffz..F 0 ~m~JL1-.Ii ~, Hibernate ~ fRJMIY-J Apache OJB -~, m.pX;~A$fj~~a9~gi!II:Q

zJ§Fflpijif:fJ1ra), fiX/};J Hibernate i!:~~D~a9~~tE1iXB9*il 0 f1=# Gavin King ~~ ffltR:i!B<J~1~~~, 1t~ Hibernate m:ilJJt-tftQ* (lHttZ. r, Apache OJB JJllj7f~H~~ RlmQ}, iltI(t{J7f1ft:i£ll;&F£~~Tt9i § l¥J~Jit)o

2003 if: 6 ~ 8 B, Hibernate 2 fj{J~;;(p, 1-J Hibernate .J:E~JJJ B9~.:p 0 Hibernate 2 ~

I!A~ Hibemate

54 ;g2.

Hibernate lin

~T~*$~£~~~~~~Wxffl,~~7%~~~~~~,$*~~,~H~~,~ :ilSh[]~fJUff~9;;!JJL ffij JPJ fJ1, ~~~ml¥J 7f :&)(l~ (Hibernate Reference) -tEJg r--t:ffl? m:f~ 7 -ffiiWBtfi ~tl ~~:1fj¥ffl 0

~ if tr.J g f1 ~ T tE nt tfj - ~ ~ A ~ tf Be, Hibernate 7f ~fl ~ tt r& 1J TSS (http://www.theserverside.com) ~J\:~1~*;f±r8: 1¥J1*.8±~, {gpj(;jg SourceForge _t1i~* lti¥J Java Jf~r~ § Z-o ~at, -tBiEJ!l!1'I~li*B\JJ~f1fll, Hibernate 7fMl~~*Arfi] ~~~~~~ti, ~~)(~~~~~ffi~~~ft~~o

2003 ~*, Java M=~m19:it®!~~:&j: 7Wj1'm~~.ftt: Hibernate Ytffl. 7 10lt 2004 *~ 1l1& Hibernate 1Lt~ I*J ~Q~ 1fi1Jffi.t,R JBoss !&~, !iX.jJ JAffA T JBoss tll~lHI9-:r r9i § z- 0 ~m-t-$fttifUJL7 Hibernate 1£ Java ORM ~MJ~B\J±~:LiBtL, lt~f~Zh~j;;.~_t1¥J lava ORM I~lJFl'lo jtJ§ t Hibernate 8<Jt'F# Gavin King nDA 7 JD02 fa EIB3 fiFm~~~, 7f~~ ~ EJB3 ~ 1002 ~lm8"J1M~ (Gavin King t£j]JLA~*-ifj§mtB JD02 f;Fm~~~ L

2005 ~ 3 ~, Hibernate 3 iEi\1t~, N{x~ Hibernate ~:ftiU 7-1'lW"JiJT**frfJI@i/jL J!:JJD$Mlo7'G~I¥J~Ii~x~, ~1*mlttl¥J~ilij]D~, X1ffffflJi~to § }EJ(M=~1t~!~I¥J xfif1~f~ Hibernate Ef.JKmt'ifaor1tiJl1iJ1t-!jdt'1~jo ~at, jtttff~tEtft*iY!tliJ\~mmiIJ 7 -<t AW13:mB"Jtltfro ~1'Wi~qjgiE~1trr, tf~f~~ EJB3 eMP, 1002 Jl:~~-mffl~~ 1t~~~JgA$~*A~.~I¥J.~o

lltat, &P 1t~JJ~JlliX1-T~ Hibernate l] I A1i::~~~ffl7f~ ~ Mjf¥~mag1*~r~tt*A ~,~mm~~~m~x~*~~~B~~~~~~~~o

~1t~ Hibernate ~olJt~JJJ?

R Hibernate '§1J~Ml:, Gavin King 7u$7 Hibernate !iXJJJI¥JJL1'~E51: 1 . ,tR ~ 1t 1JJ, I!P at IljJi] ~

{~M= m ft1( B"J 7f 1t:itttt ~1k K m 8<J 1t&* ~ if ~ ~ 0 Hibernate 1t&* ~ if mJ M tf ~ ~ ~Jg*o~m,~~~~if.~~1*~~~~.B~ag.~b~, ~~~~m~m JLh 1ifD m Hibernate fI<.J tf ~ +?t m ~ 0 ~ jr t ~ f¥1~ -tE1f - * M ~ , ff;t ~ PI !2J, ~.fJl UJJ~ lfu J}J FJ~ Jt iE Jg ffl ? JiJT ffii 0

2. ~ 00 I¥J @I ij3W!~ iJt

!it (Gavin King) ~lUJ\!.tE~1' Java f±r8:-}E~JH&:mt~§i9J~]ij3W!tluto !JQ*!fXftf e<J r}J ff~ffJ t2: it fl ~~* I¥J 1!il&, JJ~ 2- --t~*tt I¥J test suite ~f!fX fttPJ ~t:t?tt to ~ 5E

iflAi*1:f1 Hibernate

__ , ..... "'"·,"L'--oIMIIN ... -:+~'-..,.~0.'(

~ 2 • Hibernate ~ SS

'11* i~~:t£ H: ~~ m-:m:~ 0 ~ 1f] J5Y. ~fi i3:~ B<J ~ i,R: Wl * 1iff ~ miUX1tx 1* a<J ~ 1- if r}J "~j£ rr@J Y3 W!~iJt, ~1fJltl*~/G m ~7f ~i!Jm I f'F 0

3. Jil*Ji!~

~~/f'1~, ~1~, ~-JE1$:itl.~0 }jj!~fJt1J'H~~jU.Mrt-JJJJ"~, ~1I'Jltl*~,~ 1.&;&, fJ)~~1W.fX14~JG'*p~0

4. :iM~J111i)tit

m.*.rt-J~~~Mhmfitx#~~B<J~.~tx#~~mttr~,~~~$~~ atra]*M13cmpOOrlQjt¥J~~~fOJlio ~!f!-g! *X1*figE1T~ OK, 1f'~~m~Mtj(1$ 8''1 ffl P m*~*Jt\ rt-J fOJ ~ 0 we. i~\ll~]!ft it iiit ~~ ~tt~ ill ~:ff ~ ~, lSi. iE~ Jl:~}] ~ ~ft ~I$! ~ J§:pf refactor. 1tF~**ii 8<J Ib1 »J&Jl:&. a1:!:tB%JJX.:ff 1fI-ft I¥J r}j ff~ 0

5. #!fX

~~S~~~~N.mH~.~~,.~~~B~*~7tx#I¥J~*~~otx# 7f~~~~-~1-7f~~A*~~,i!~~~~~tx#7f~rt-J~mtt®~~T~~A *~~~, ~~~~§~H~m~.~*hre~~~~oo~~.~.~oa~ffl. ass txf4.*rt-J}x\'~mt~~m~#f-, ff-1-00~~*, ~*1t~~JH1!fif~~o

6. :tt~

~:ff~~~~~~.~o~.mp~~~~~tx#fi~~-1-~~, •• T~~ ~1-~~, ~Wl.tt~~~~, ~~~.~~~~.~No

7 . i!It ~ fiF ftE {t

6rt-J~m~~.*tx#rt-Jlimft~~.Mtt, ~OO~mR~Sgtx#M~!

"xtf xxx fJFm" ~*~::fJl:.~B<Jmp1l*, tJjjJIJ£~i3:1- xxx fJFmJl:ElJ J3~~btEJt1fl:~~~l1&I¥J" JiJTiW" ~~~ 9:lJiJT$tiJE8<Jtffm. 'F (~~~: Jt~f=m Sun, IBM ~ JL1'- big name? )0 iiMl¥JfXitfJEtE~lfJT:f.t!rril;i\, /f'lJJi:f.t1t!J\H~m, ~lfJTl¥.Jt2~~ ~ rt-J J1f~ ~ t= ~ I¥J 0 $ ~ J:: I¥J tJFfi tl: ttJ! 1ID!ils'iiB: m p jffl)]< 0

( !jj ~ ~: Apache OIB 1I lk jj iii jp Jt -1'- J!. ~ ~ Jj,,_ 1!cJ, xt T fJT 1W # >lit ~ :it *it Jt:. $t)l M A 11 ffii ) 0

8. 5 7t M' ~ px r}] jg 1T Hibernate

M:t£8<J Hibernate fflp{£1t!!1n~ti:7 Hibernate ~E, ~-{.xftjijl¥JfPffr*~*it~ RAiJIIiJ Hibemats

Hibernate ~

~~~~~~~m~~~~*~.~~.*M~ft.~tt, ~~~m~~~.~M Hibernate i¥J~~o ~1fJ[(.JtJ~i;ft~iffflP (fN12:1f.1E~i¥J JDBe ~QiJD PJ~tE 5 7t ltJt~ ~JJX:JJJlg~r Hibernate Demo, ~B>jff~~tE 1 ~/J'\BtZ ~ ~ ill "Hello World" .rtfl<] :efij~s<J Hibernate ~J¥# iiiE'MlEqf 0

9. Jf~A~ fJ<J~1f:~

fflp ,~d~:~ijJiff~±H!1i~~¥tilb1jL 7f~OO~~Mff~ 5(*t&~flIWJo mpiJ:~1r'J~Q ill T )c*~ i¥J1i~, i1:~1fJ ~Q:i1t 7 ~tliJ\ffl {9~ i¥J IJ\ Bug 0 !Lt5r, iiff F1Lp *ffl ~{fJ 8"J Hibernate, itt1n)±3ftl't1~ft-z., ~~¥~~Btra)~!

10. ~ m i¥J ~ -aT £ iT 8"J wiki ~]l

t~ii_tOOIfj~8"J1t-~B, ffim~#Bt~:t-j Hibernate ffT-~fnZl78"J7M, rim, *~ ~~m~~~«*s<JM~mm~.7fW~o #~, ~mM-~~~A¥,~~®~o

RA~tI:f Hibernate

-JNi#f8¥Jt1*1i*~451!, m~ff "Hello World" P;:~Af1~J¥o *4SiB/1'~!kf?t, {£*~q:tjji1--tM_iji~;t19tl, ~px;1£-1'- Hibernate ~*~ "Hello World "0

*!fi:±~]A!;J. r JL1'-tm7tJittfft!B: • fl~If1-:

• EIJ ~ 7J\19rJ ~~ ff
• f1;J~ Hibernate ~flli1~~
• Hibernate mc~
• B~iN~.
• m-~ft~
• 1i: iij fn f8¥ RA~ Hibernate

58

3.1

Hibernate

Hibernate" Hibernate-Extension, Middlegen-Hibernare , Jllnit

JDBC

Eclipse 3,x, (

(

l\1ySql

)

Hibernate T Hibernate 2.1

11&* 3.X

(

Hibernarexample Java

)J

3-1

1113-1 Ii~~ HibernateSample Java ~

MySql JDBe lib/Middleflen-Hibernate-rfi/lib

(

mysql-connector-java- 3,O.O-beta~bin.jar

Hibernate

Hibernate

il!AilJ;!:fj Hibernate

3. 1 .1

3.1 }fiaI~ 59

1. BIJ~71'19tlti:Ii}$o

2. fZl~ Hibernate £{imf~~, fE)C1C~~JXimP-f~ ~~1*~z.f8]I¥J~M~~o

3. 7t~ Hibernate ~{iIfi~.w 0

create database sample:

CREATE TABLE 't_user' (

'id' int(11) NOT NULL auto_increment, 'name' varchar(lOO) NOT NULL default" PRIMARY KEY (' id' )

) TYPE=MyISAM;

3.1.2 ~. Hibernate aillftW

Hibernate ~{iilif~lij'E!fi5 POJO ~fll Hibernate IJRM::tftto

POJO if Hibernate i1f)(~l!.M~fli1i!i.$~mX1@a<J Domain Object, 3S:lI!l¥.I POJO &t £JiJTiFHt-J "Plain Ordinary Java Object", *mLt.*ijHtJl:5t~j_\~i! Java ~~, PJl;1Iil-4\ !t~JI~1J-1'-/f§~~.f-t~e'-JmX1. (Value Object, fijl$ VO)o MflimJiHti)_t.*ff, POJO 1tJiJf(i1iS~1*I¥JM.1t~!JVfj~, ~~1J~1*~o

~ t user ~X1 @.I¥J ~ 1*~ lftr ~ JiJ Tusen

public class Tuser implements Serializable { 1* * If] r Jt1t-~;f.-iR * /

private Integer id;

1IlAf;ftfJ Hibemate

!**Jllj-£#*/

private String name;

public Tuser() {

}

public Integer getld() {

return id;

}

public void setId(Integer id) { this.id = id;

}

public String getNarne() {

return name;

}

public void setName(String name) { this.name = name;

} }

Tuser :(fi!£ 1*!£I¥-J~ ORM ~ Object ~l¥Jm)(, fiPX>t "fflp" ~1*I¥-J:tmj!., E§ * 7 ffl P I¥-J ffi :1C 1M tt (*= 19HB ~ m1 1ft jf£ J1i!. , R '11 i\ 7 -1" "name" "" tt ) 0

t_user ~:1C~~fij~~~, ffl-T:fffiifflp~~o ~* Object fOflf&If)E)(, WtpT~jj iiBj(~Jt)({tt~1Lm#z.rB]I¥-J~1f* (~M) ~~, JS:tB~~JlJTinft{] Mapping,

Hibernate ~-f'P "X>t~~~~~~~Mt1l1tt", E1tffl~M;t14~X>t~ (Obiect) Si* -*mfl1S (Relational) ffi~1f*o {£ Hibernate T", ~'t:'t{tfjj~i2J. "Jibm.xml" tP~J§tHo

ftJ ~ Hibernate ~iili{~fi~jj ~ ~ i2J. "F ~ 1£:

• ¥I~1=3o .~~I¥-J~.~#.1=3~~cm.~~~&*M~~~~*~,~oom~m~ ~M~mAI~~o

• ~M.~$~)(%ili~~~, #~~m&ft{]~M~#~hw~~o JS:~~~*~~~~ffll¥-Jn~, ill~~£mm#I¥-J~~o

if11i1li~JA § l1F~~J$9='~ili~~taftJ, ji/Jvft T ¥ IfiU1?7~~mft{]llJff~tt, M®{£~*~N~*~T~M~#~hw~~~~~.M~M~I¥-J-BttQ

• ~tIi5!JIt.~1¥J Java 1-tfi1?,~pxX>t @J¥-J~M)c1tf, Mffij~ Java ft~ ~ltMP-f:;&#Jm~ 0 jji1HB'G~1=3tlfft{] POlO ~px:~Mx{tt, i!#1Jj_\1£~jI,j7f1t~-tE~~1it1tffl, !M=glj ~ gs ~ T XDoclet Z J§ ~ ~ jt ~ ~ m, Jtm tE fiiJ JM ~~ ~ ~ ~j fl. If ~ ftJ Z~IlJ~~~~~~I¥-J.~, ~~ •• ¥I~.~~,ttttW§~M~~~f ¥I.tP~.~,~~.J§~~I¥-J~~~#.~,~~ •• {£*~~~m~.o

!f/lA~ Hibernate

3.1 .3

3.1 .a-IfF 61

~ ft XDoclet, E8 POlO ~px ~M)( ftt (fJ 1i*~tE "Hibernate I A " 9=t:iJ!fi ~ it 0 tE*fJ~J:f, !lt1fJ~1-fm=#1J~, ePlli1~~,$~J(~pxWTm~B<J Hibernate lIRi'tx1tto

liM Hibernate -g1J~fjt(fJ MiddleGen for Hibernate ~ Hibernate Extension IA'@" ~1fJUJl;.tjJ{f'~iltt!!mli!_w.1f~IiW~I:tlW=«~~, #-1:.pX;X1magaJcMx{tf~ POlO 1~fi!?Jo

.-~, .~E. MiddleGen 11i •• BfJ fit tjltlt,. •• z

ittA HibernateSample JYi § EttJ IibIMiddleGen-Hibemafe-r5llibiconfig/dafabase ~ § Jj{, mimft ffJ~~j*mEttJ~~$1J1fX1~EttJgc~x{4o~i3:£1fmMySqlltjiW,X1mi¥J~J!mysql.xml xf40

<property name="database.script.file" value="${src.dir}/sql/${name}-mysql.sql"/>

<property name="database.driver.file" value="${lib.dir}/mysql.jar"/>

<property name="database.driver.classpath" value="${database.driver.file} "/>

<property name="database.driver" value="org.gjt.rnm.mysql.Driver"/>

<property name="database.url" value="jdbc:mwsql:lllocalhost/sample"/>

<property name:::"database.userid" value="~"I>

<property name:::"database.password" value="mypass"l>

<property name« I. database. schema" value=""/>

<property name=="database.catalog" value=""/>

<property name=="jboss.datasource.mapping" value="mySQL"/>

NA~ Hibernate

p~~{fiijo

.=~, .tl MiddleGen tJCJ build.xml ~.xfl::



1~~ MiddleGen-Hibernate-r5 f& ~ 3J{ri¥J build.xml x14, Jitxitti! MiddleGen l¥J Ant #J1triC~ 0 MiddleGen ~mtw build.xml x1tf:t:f t¥-JA1*~lt~px;fiim~~~Mx 1tt"

tE build.xml ~, $~mGi:fr-JJm § §fi5:

• § f~~jg$nc~x1*Jt!!hl

~t~*ll* it ~ENTITY", ~JU:

<!DOCTYPE project [ <!ENTITY database SYSTEM

"file: ./config/database/hsqldb.xml"> ] >

~~'t~t5rf, MiddleGen ~lU§ I¥J~ hsqldb.xml- :#fJt1~l:&1-J~fnpJT jlHr.JliliiP-¥~c!l)C 14 (rnysql.xml ).

<!OOCTYPE project

<!ENTITY database SYSTEM

"file:. /config/database/mysql.xml "> ]>

• Application name

<property name="name" value="airline"l>

"aireline"J! MiddleGen Jj§iMlmc~ ~ !Jj\iAi¥J Application Name, ~Jt~i:&~ ftfr'JPJT~ ~ B"J 4S ~, 3z0"HibernateSample":

<property name="name" value="HibernateSample"l>

~ 1.:t~m ~ "name="build.gen-src.dir"", m J1J:

<property narne="build.gen-src.dir"

value="${build.dir}/ gen-src~/>

RAi*1:I1 Hibemate

3.1 )ill-IfF 63

<property name="build.gen-src.dir"

value=" .. I .. /src·/>

• X1 ~ 1~ ~ I¥J Package name

:ft1~~tI!¥ "destination", ~¥tl:

<hibernate

destination="${build.gen-src.dir}"

package="${name}.hibernate"

genXDocletTags=" false" genlntergratedCompositeKeys=" false"

javaTypeMapper= "middlegen.plugins.hibernate.HibernateJavaTypeMapper"

/>

-ar~~$tl,hibernate lj B package .tte<J~iA ~~~~"FJ:~ EBlWOOl¥J Application Name (${name}) ~ ".hibernate" m-g-ffij!iX;I¥J, ~~~1fJl¥J~~, :#f~r.&~:

<hibernate

destination="${build.gen-src.dir}"

package="org.redsaga.quickstart" genXDocletTags="true" genlntergratedCompositeKeys=" false" javaTypeMapper=

"middlegen.plugins.hibernate.HibernateJava'I'ypeMapper"

/>

J!lI!~~-1'.tt genXDocletTags, Wl*ti~~ true, 9lIJ1::IJX~~~~§ * XDoclet Tag, ~~~mtE7f:&:Ji~9='f~WJ XDoclet :i£rr~Mi,fi\] •• ~71'HljJo :X:f Hibernate l¥J XDoclet 1!ffl, if~ ~*~jJffjj{ "Hibernate IA" J:f l¥J1t~lL

~.tlt~.1ll:, MiddleGen Bf&ftC.%*, )Err middlegen-2.lIsamples §jj{~l¥J build.xml'.

JIlA~ Hibernate

tB:f~ MiddleGen A<J In (

1b.A.\ lib JDBC

JDBC

MiddleGen

MiddleGen

MiddleGen

3-2

[IJ 3-2 MiddlaGen'" iii

rp w~~;ftj MiddleGen

~ 0

.. Domain class name

POJO ~~;:g

.. Key generator

ffJ~~

.. ){

identity) "

net. sf. hibemate.id.Identifiertlenerator

.. Schema Name

ilAf=t1iJ Hibernate

3.1 ... IfF 65

It':11&W Schema Name 0

• Persister

§ };(5(f;f~~~!1~~~, ~Il~~mt:p~tm~ Hibernate Z3t~eq~~m~!~fJUM. ~ iBU:1 ff fit J1 ~ ~ ~IJ §f t~ fl ~ ~'L It ~]A LDAF tp $tll~.fl1(t*:tl Jt::& if] eq POJO"

• Enable proxies

~ N 1tffl1~ 11 (ffl-=f ~i!i1JJJtt [Lazy Loading] ) 0

• Dynamic Update

~[]*J1~, 9!1j~1£ Update SQL B11F~**a1:~~8<J~fij6tt, J!;ff"ilJ~tEJE~fll:.ft SQL thAf~~o

• . Mutable ~~~~~~~,.~~~~~~(m~)o~.~*m~ffl~~~~~~@eq ~.~~~ff.a(~mf~.$ROO),~~nmx~~~*,~€~~~eq Delete ~ Update .fF~~~~ 0

• .Implement the Lifecyle interface

~N~J£ Lifecyle it [J 0 Lifecyle tl[Jtl{!t7~i15IB11tii~~ l¥Jt£ft~~n, ilii ~!~ Lifecyle ~J:J, ~1fJml;J.tE~J~~.fFtp1JJJA@lOO (Call Back) tfLittl, ~UtE ~~W~~Z~~Zm~~m~~*o

• .Implement the Validatable interface ~~~J_m Validatable ~ JJ 0

ili1~JJM Validatable tt n. ~ifJPJ I;J.tE~!@i.ltJI1tiljti:tQi,f$~Z.lWX1;lt.g.~tt ~tr~tiEo

11U-fHt1t a<J £, iilJ1~$ Lifecyle 1t J:J, !tifJ ~~~ ~t£lt •• ffz. WI~iiEltIHfJ~ Y-tt'i, ~~IY-JJ!, Validatable 1i[J~fE)((fl validate jJltRJtm~tiiMJm~{j\, ~JJt1iit~ m:ij!!~tE Validatable * [J ffl validate 1J¥!~J}!~1JOA~*~.l¥Jij&iiEo

1dA_tJ&ttX1 Class l¥J~~, tE MiddleGen t::p, ~~tBffX1'~fiJlflJ¥J\iWotE MiddleGen 9=t~JE~1-~m:, :ff.iIiff1i&P lli1Jl~a~MIlf!l¥Jii~~ (fI] 3-3)0

JIlAMlff Hibemate

---------~.-~-.

• Hibernate mapping specialty

Key:

Property:

Version:

(optimistic locking),

• Java property name

Java

• Java type

Java

• Column updateable

~hX; Update SQL

Jli!Ai:#t1:li Hibernate

3.1 ~.Ii~ 67

• Column insertable

~JJX Insert SQL Iij~~§***f&o

• m iT 0 J]HflH¥-] Generate ttitIL MiddleGen tIP 1:.JJXJ3: Jfu~1i $~m X1 illZ EEl Hibernate aRMJtftto tE HibernateSample J.m § ~ ~ *=r~\src\com\redsaga\quickstart ~ *=~, 1lJ ~lit !.9tX>t@i¥J Tuser.hbm.xml ~MJtftt, tE~-t-~MJtfttr:p, JEJ( T Tuser ~ilj t_user ~BTI~M

**0

tEIHjffH~~En.tfMl$7t, B~5CJJX7 Tuser 1¥J{~ii!bo J)t71[~~~1~i~, POJO ~ jf 1lJ ~ ffilJ9;t M Jt f41: fiX. 0

POJO ft-J1:JJXIfFi!.tt Hibernate Extension r:r~ hbm2java **JJXohmb2java 1lJ~~t@i

~MJtftt1:lJXxt~~ POJO {~fi!ho

rOO, !lt1fJmttili MiddleGen {~ftl8<JBj!MJt1tt, liM hbm2java IA1:lJXxtm~ POIOo hbm2java IA8<J~ffl1JA:ffl&$~,· i3:1!1tm~f Ant fl<Ji,lJffl1J~o

zlilJ~&~ MiddleGen ~}tJj!;p* build.xml 9=' B~-E1*7 hbm2java i¥Jf:f*, fflf~jg Hibernate aR~Jxitt1:.mt POJO, ft1rJPJ ~*,Jm i~Jj:~px:B<JJJ!p* 0

tE MiddleGen-Hibernate-r5 r:p, :1f1i:ff1g* hbm2java ff:*m$~fl<J Jar~, ~.Llt, fJt 1f]1Z\~.D!tE build.xml X{ttr:r, X1 Hibernate ~& Hibernate Extension r:p (fJ~$lttrrft[.~ 0

1T tf HibernateSample J.m § r:p Efl,]lliblMiddleGen-Hibernate-r5Ibuild.xml X 140

~ 1~~lJt * "<path id=ulib.class.path 11>", ~ flJ :

<path id="lib.class.path">

<pathelement path="${database.driver.classpath}"i> <fileset dir="${lib.dir}">

<include name="*.jar"/> </fileset>

<!-- The middlegen jars -->

<!--fileset dir="${basedir}/ .. "--> <fileset dir="${basedir}/middlegen-lib">

<include name=" *. jar" /> </fileset>

<fileset dir="${basedir}/middlegen-lib"> <include name="*.jar"/>

</fileset>

</path>

t£~1'~l£~~~Ja1J~ Hibernate 2lJl Hibernate-extensions a<J~§o

JI!A»Iftf Hibernate

3.2

<path id="lib.class.path">

<pathelement path="${database.driver.classpath} "I> <fileset dir="${lib.dir}">

<include name="*.jar"/> </fileset>

<!-- The middlegen jars -->

<!--fileset dir="${basedir}/ .. n--> <fileset dir="${basedir}/middlegen-lib">

<include name="*.jar"l> </fileset>

<fileset dir="${basedir}/middlegen-lib"> <include name="*.jar"l>

</fileset>

<pathelement path=" .. /hibernate-2.1.7/hibernate2.jar"/> <fileset dir=" .. /hibernate-2.1.7/lib">

<include name=" * .jar"/>

</fileset>

<pathelement

path=" .. Ihibernate-extensions-2. 1.3/tools/hibernate-tools.jar "I> <fileset dir=" .. /hibernate-extensions-2.1.3/tools/lib">

<include name="*.jar"/>

</fileset>

</path>

~~~~~~$~~ ••• ~~~Wo

iEff~~ftJ}t)(14~ B<J hbm2java ff*, mtjlJ~~frj POlO ~o

~Jlt, ~ifH~flj 7 ~M)(i4 tuser.hbm.xmllD POlO ~ Tuser , AlitJif HibemateSample J91 §, it1fJ:t£ src § jf{~-ar1JGilj1::JJX:i¥J~Wj~x{4 (m 3-4)0

El~ sr c

[3 is com. r.du, •. qui cklhrt

. [±i flI Tuur. j .va

: . ® Tuser. h.bm. xml

1113-4 ~MJt1* tuser.hbm.xml;JO POJO ~ Tuser

ft1I'J B~?:f1Jffl MiddleGen l!l hbm2java 1::JiX; 7 Hibernate l¥J~itfH~ii!?, 0 ~-F MiddleGen l¥JAl*-ftffl1JA, iff~ ml*t~!:f "Hibernate IA" i¥J;f§:}C~Wo

Hibernate fl.

Hibernate ftG~)( i4 ± ~ ffl-F ft[.~flli J¥i!1tl!l Hibernate ~ 1rH1 Jiff.1¥J ft# Jtf&tt 0 Hibernate ~H1j[M= xml mA;l¥Jnc.)({tf~~#fl¥J properties xittftcii1i.it, /f'u~£

iNV\~ Hibemate

-------------_._." ... , ...

3.2 Hibernate~. 69

Jl i)L*ffl xml ~ nc.x 140 xml lIC!lx 14~~ 7 £ M, il8<J ~ ~ -fl] J! sIil8<J ft[.i! ft~jJ, PI PJ 1I fix-f BJct-tt 141Jo l;J. WC~ * EI3 Hibernate § Z;1J 1J[I!l 0 ffij{E properties X 14 9=' D!IJXlt.d~ JIJ~ F.L ~~~fi~9='~M~~~ff.MX#8<J~.o~OO~*~~~~~~,.m8<J~~~x~ *i A:x 14 ~nc!l1J ~"

~~Jtf4~l"kiA.~ "hibernate.cfg.xml" (9JG~ hibernate.properties ). Hibernate ~}]M1«:

WHa]~ §~~ CLASSPATH ~~~~-1'x14, *W;!OCJt~8<Jnc.ffi.~, ~'€MfJ:~$!lfF 1M:tffm~"

-1-A~8<J hibernate.cfg.xml nc~)c141l1l~:

<?xmi version="i.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration

PUBLIC u-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd

">

<hibernate-configuration>

< !-- SessionFactory Ie-I. --> <session-factory>

< !-- .. .tt;+'URL -->

<property name= Ilhibernate. connection. uri n > jdbc:mysql://iocalhost/sampie </property>

< !-- "41k~JDBC~i#J -->

<property name="hibernate.connection.driver_ciass"> org.gjt.mm.mysqi.Driver

</property>

<!-- .. tl~)ijr..£ -->

<property name="hibernate.connection.username"> User

</property>

< ! -- 4ttl-~)f] r!Si~ -->

<property name="hibernate.connection.password"> Mypass

</property>

<!--dialect , *+4ttl,*fI$*Jt.~S.6?Dialety:.t~Ie-Jt..-f-{;#·11 --> <property name="diaiect"> net.sf.hibernate.diaiect.MySQLDialect </property>

< !-- :..t..?i~j!At-AA~h\6?SQL.~j~ E1.t"A~1,Ii]~ --> <property name= II hibernate. show_sqill >

NA~ Hibemate

True </property>

<!-- k~1~JfltttJk4j1~~* -->

<property name=uhibernate.use_outer_jo':"n"> True

</property>

<!-- *~'fJ!-l~, l!.£~1n1tfflJDBC Transaction =>:»

<property name="hibernate.transaction.factory_class"> net.sf.hibernate.transaction.JDBCTransactionFactory </property>

< ! -~M x.1t ~e.I, ~i. i: 6je..i. X. * _£ .)/.- 3§i ~* $.:fro~ T-tfllr-J 1:-J/$.{f - - > <mapping resourcez"com/redsaga/quickstart/Tuser.hbm.xml"/>

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

Hibernate 3 9=' X1 ~ ~ :itt ff 7 1li & (net.sf.hibernate => org.hibernate) 0 :Wl ~ * m Hibernate 3 i11 a: ~ 1!i a D~ ~ X 14 tp I r ~ aq § ~, ~Q net.sf.hibemate.transaction. ID BCTransactionFactory J~1~ a ~ org.hibemate.transaction. JDBCTransactionFactory 0

Jj )tr , Hibernate3 tp »t FE. aq DTD X 14 :h:

http://hibemate.sourceforge.netlhibemate-configuration-3.O.dtd i~a: ~ 1~ a < rOOCTYPE> 11 F.f_ 9=t I¥Hfc if 0

~---rA~1Y-J hibernate. properties re!lx1tf::M-r:

hibernate.dialect net.sf.hibernate.dialect.MySOLDialect hibernate.connection.driver_class org.gjt.mm.mysql.Dri~r hibernate.connection.driver_class com.mysgl.ldbc.Driver hibernate.connection.url jdbc:mysgl://localbost/sample hibernate.connection.username user hibernate.connection.password mYDass

i£*:¥'ft, .#f*m xml ~~l¥Jre~Jtftft1=~/F~Jo i£ HibernateSample J9! § I¥-J src § jj{ T. BrJJ!J*J~~J:.8<J hibemate.cfg.xml X1tfo iwa:~f~i:&~*~J!fl urI ~&ffl?~~~Hiq IdJ- f,1-tt 1~Ht-J ~ ~-Ftff m. 0 ~ 7 ~gi!J$ ~:ifili lr M 8<J SQL {tIAr a .t; , i~HE hibernate. show _sql frlt '11: fi![ ~ true 0

JilA~t:Jj Hibernate

-----------_.'_." .-.".".~,.'"

3.3

3.4

3.4 ~-mte~ 71

f.J 7 'it ~ 7f act ~!1! 11D J[ ~_m , fj ~ jWf m:Hibemate B ~ ~ J9l1;J. {f ~_m ~ Jt ~ f'F B<J ;W 1) 0 Hibemate*ffl Apache common logging, # ~ it Apache log4j fF ~ B ~!fWJ ili m ftt 0

HibernateIt1-r§B<Jetc § 3J{r~11W T -1'-7J\-w~mG=rlog4j.propertiest ~i3: 1-)(1tt~ ittlirJ CLASSP ATH ~ ~~ -aT 0 X1r Eclipse mJ~ t PI 1;A~log4j. properties~ {£ ~~ § ~ T ~ fI T 1~ t& (Ec1ipse~il:Jlfi § ggR11~~ § l;I]~~W § ~rlit)c1ttJiittl~tl~1-rm § jJ{[bin]) 0

~~R~W~#HS7*$~B~~~,i3:~~~~~H~~~OO~B~ffl~m~~ M,~7M~~~.H~m~B<J~ •• fF~~,X1Jt~H~r.~, m~R.ilift~F. EJl.Jffh~1j§ ,m I;AlkHibemate1:JJXB<JSQLmii] 0

log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p

%c{l}:%L - %rn%n log4j.rootLogger=info, stdout

# # # _R.fir m hiberna t eiE~ti:t;f.i l' ~«h~ El ,t log4j.logger.net.sf.hibernate=error

iG hX T ~liilif~ 1i!?J -fl1 Hibernate E 1-r JiJT 1Ifi 1¥J~!i ~ 14 t ~{£g PT IdJ. ftJ it m -f& ~ R 1t 1~ li~ T t ~'!Jt-r Hibernate JiJftll#t1¥J5!i*JjJfj~n(g 0

{£ HibemateSample Jm § ~, iflt JUnit ~~-utffl-W~ HibernateTesto IJHr'];j4i1cti3:1-f0 it! Ef.J W!tliJ\ffl-W~ ~ ~ Tuser X1~ Ef.J 1*ff:ll1 it!li.~fF 0 ~ mfrJ it:tt -aT fi~i2:1f JU nit B".J f_tffl ~~~ , 1~E.q~1JQA 7 -Jl:~ JUnit *IL~¥.±~ Q

HibernateTest.java 1~li~~r:

public class HibernateTest extends TestCase {

Session session = null;

/**

* JUni t tf setup7.i* _.(f. TestCase:fJJ*i:{tdl~ atil~ ro #)1,1) ffl * -~ffl-t fJJ*i:1t4.\.. fil i- a..

Jl!AiJIftf Hibemate

72

* Jltl1rJ'f, JfJ -t;;J]:H;{tHibernate Session *1

protected void setUp(){ try {

1**

* ;ftJfJhibernate. propertiesA*hibernate. cfg. xm I

* tit..I.;t 1+ ~ ;fJ] # 1t1\J!!.J :

* Configuration config = new Configuration(); * config.addClass(Tuser.class);

*1

/ I *-JfJ hibernate. cfg. xmlJie..I.j:_ 1+

/ lit £i J:.til iJ!J )i.*~.1(.~~ H:., )i.i;;;J]i{;{tConf igurat ionBt iJ!J 1. Jt:

II 1. Conf igurationfr!J;;JJ:f{;{t:;;t A

II 2 .xrnlj:_1t'f eAf;t5t 1 Mapping:i:1+, ~Jlt;{.1;1j.tA~.Jf-A Configuration config = new Configuration() .configure();

SessionFactory sessionFactory =

config.buildSessionFactory();

session = sessionFactory.openSession();

} catch (HibernateException e) { e.printStackTrace();

}

}

1**

* ~ setUp:;;t*;;ftl~ JlL, JUni t TestCase·YtAt:;t!F-!M", ~ ro #J1}i]J') tearDown:::t*

* -~JfJ -f~~#"m:

* lltl1rJ rf, m -t*/;f],flsetUp:;;t* rf .tr-Jtfr!JHiberna te Sess ion

*1

protected void tearDown() {

try {

session.close():

} catch (HibernateException e) { e.printStackTrace() ;

}

}

/**

* ~ #.#A1t. ( Insert) ;,JIlJii..:::t*

*

* JUni t tf, }-:J." t es t .. ft: j]'t-rtftl¥):::t ~ jJ ~rJ iA:.;.t *, ~itJUni t tJ #J ~»11 * jlJ ~1 ii. -it ~Ij 'f ~ ~t

*/

public void testInsert() { Transaction tran = null; try {

tran = session.beginTransaction{); Tuser user = new Tuser();

user. setName ( "EIruna" ) ;

RA~fii Hibernate

_____ ----------~- ..... "'Jal·<·:·~-,::·-

73

session.save(use sess on. f 1 ( ) ; tran . commi ( ;

ert.assert } catch (H

d I l v i.nt; Lue t ) O,L

00 e) {

ert. il (e. if(tranl=nul ) {

( ) }

t

(

t

trao.roll

cat (H e1.

t 00 ( ) ;

) {

k ( )

}

}

}

\

f

/**

*

'Er

*/

public void t lect() {

Str 1=

name 'Emma'

try {

st userList

I} . 1

( ) ;

sess on.creat

Tu er user =(Tuser)userLi t.

Assert. sert (user. getName ( ) i Emma");

} catch (Hi e. int c Assert.fa 1(0.

) {

sage ( ) ) ;

}

} }

(

JUnit

(

t_user

IlAiItff Hibernate

) ;

?

Java

JDBe

SQL

SQL

Hibernate

"SQL

Hibernate t¥:J

JDBC

Hibernate

Hibernate (

II! 3~6 Eclipse a<J i. ~*Ij *!4!1II

~J T JDBC

*/ protect l** !

'"

r t i

*/

0;

if!Af;fliJ Hibernate

75

try {

prop.load(this.getClass() .getClassLoader() .getResourceAsStream("data base.properties"»; Class.forName(prop.getProperty{"connection.driver_class"»;

/ /t'J1t~.tl4l!.ji.

connection= DriverManager.getConnection(prop.getProperty(" connection.urlll) ,prop.getProperty(" connection.username"),prop.getProperty(" connection.password"»;

} catch (IOException e) { e.printStackTrace();

} catch (ClassNotFoundException e) { e.printStackTrace();

} catch (SQLException e) { e.printStackTrace();

}

}

/**

* J:j setUp~*~Q~ EI, JUni t TestCase.:f;ltAt~¥Ilf, ~ ~ #Jir'lJfJ tearDown:ff*

* -.ft1 -t 1::;t. ft:it

* Jr.1frj oct', Jfl-t* l~lIset Up:;;t* oct' JDBCiIlJConnect ion */

protected void tearDown() {

try {

if(connection!=null) { connection.close();

}

} catch (SQLException e) { e.printStackTrace() ;

}

}

/**

* ~t..#A1t (Insert) ;JlIJ~~*

*

* JUnit tf, ,,~ "test" 1t;9t.r.€r?;t*JlJ~JN~;t*, *ltJUnit ro #J~hu.ftl:JNii3t:l'Jtpi!At */

public void testlnsert() {

/ / *'f itJf1 i'

Tuser user = new Tuser(); user. setName ( II Emma II ) i

try {

/ 1*4}f] jt 1t .t

PreparedStatement stat = connection.prepareStatement("insert

t_user (name) values (?)"); stat.setString(ltuser.getName(»;

stat.execute():

NA~ Hibemate

__________________ ~:lIf\l:'1';·~~~J

ResultSet rs = stat.getGeneratedKeys(); if(rs.next()) {

user.setld(new Integer(rs.getlnt(O))); System.out.println(rs.getObject(l) );

}

} catch (SQLException e) { e.printStackTrace(): fail(e.getMessage());

}

}

/**

* ~t-~~ (Select) Wl'lii.. 'iti*-iifj€_.ft.:t.lifr4't.ti4tf:r ~!i4.if.name= 'Erica' t1ic.i!t */

public void testSelect() {

I l-if ItIfJ r

try {

/ / 1.J JIJ iil) s: ~* {(.J rJf;jf 1 ~ ,t

PreparedStatement stat = connection.prepareStatement("select

id,name from t_user where name=?"): stat. setString (1, "Emma It) ;

ResultSet rs = stat.executeQuery();

/ /fJT~-+Tuser{rlJ ~l11J I *~"1iJt5*-. tfJt!.~Jtl~-*"ttii

Tuser user = new Tuser() i if(rs.next()) {

user.setld(new Integer(rs.getlnt("id"}}}; user.setName(rs.getString{"namelt)) ;

}

Assert.assertEquals(user.getName(), "Emma"); } catch (SQLException e) {

e.printStackTrace();

fail(e.getMessage()) ;

}

} }

~~~IDBC~~~H~~,~.~~~~~~~.,~: ~.~~~ •• (-g~ J¥~ tljIYi'.aftitttil, »tf)t~~rf**I¥J§* PJfI~H::3&ltf¥J) .. .ittlitB.fO Statement ~H-ffJ gffl~o

§J,,~, -£Lw:~EJt~~~filt~£i&, !~~ ~,*~7f~A~ PTtf~~~f~i&JiJT;ffl§ ~~ I¥J SQL i~1:D&Jt~ffl{~~o

i3:£ It 1tJ ~ 1} $1ttiVjl~, i!t~ m ~ § 1fJtffT X1 ~t iJJ3 fi 1~~Z. fBJ ~ ~Jf, & Jt1t J§ ~iit a<J1~/~o

MA~ Hibernate

3.5 .ftiij~. 77

_too, ~1fJ%~ 7 ~-¥!( Hibernate 1~~, ~f£i1:~inM;a$i1~~:i£rr-Jfu@]~I fl::, #-{!f.tlttl~. ltt-Zf;1JQ~X1 Hibernate flkfF¥l~8<JJmfi~re~.,

{£ Hibernate 'fl, Session ffi.Jlf1GpxX1.B<J*!A1-t~f'F, ffiJ Hibernate Session z.~ Hibernate, ffi ?i§ T lDBC Connection z !:ij JDBC.,

Session ~~tlI¥JB'J~, A3&fffl~12l ~ 31-~.:

1. :fJJM1tt Hibernate ftGjf1fJJ.~ Configuration,

~ii1~A~:#lJ\iA8<JftC~)(f4 (hibernate.properties~:¥f hibernate.cfg.xml) *€'J ~#fJJ~tt-1' Configuration ~(f{]~{¥fj:

Configuration config = Dew Configuration() .configure();

1: Uff B<J 1~ i~ ~ fU m CLASSPATH 9=t l¥J ~ iA ftC W )( 14 hibernate.cfg.xml( El hibemate.properties)ftJ. Configuration ~f9tl 0

2. jiM Configuration ~~{¥fJ~tlil Session 8<JIr~ SessionFactory:

SessionFactory sessionFactory = config.buildSessionFactory();

3. ili1 SessionFactory ~JU Session ~iJrJ:

session = sessionFactory.openSession()i

)ii1~-t- Session ~1Jtl, ~PJI;J.X1X1~jj!rr·*~f.t~fFo

:tE*:f:l¥J HibernateTest ~~, setUp01J~~JiX7 l:i£ 3 -t-~~, BIJ~T Session ~1Jtl., ffij{E tearDown01J?t'fl~ Session ~WtJ~~ (i! ~ JDBC I¥J Connection ~-W~1J;L tE1tffl 7t1;J.J§$~~ffl) o

~3?IJ Session ~i9IJ~J§, ePJlJt£~~iJt1J~~1JllI;J.1tm, i§lJ~: testlnsert01J~:

public void testlnsert() { Transaction tran = null; try {

tran = session.beginTransaction();

RAI.ItIi Hibernate

____ -, \;"~<"-"' .. <s-. _-

Tuser user = new Tuser(); user. setNarne ( .. Emma II) ;

session.save(user); session.flush{); tran.conunit();

Assert.assertEquals{user.getld{) .intValue(»O,true};

} catch (HibernateException e) { e.printStackTrace(); Assert.£ail(e.getMessage(»; if(tran!=null) {

try { tran.rollback()i

} catch (HibernateException el) { el.printStackTrace(};

}

r

}

testInsert 1J~1E Tuser Xif~~i9~f*ff (~~ it) itl~~Jftp 0 J~Ji1~~1l, Jm.Mimlffl session.saveO~.f_m 7 {iff~1t, zJ§, jiM session.flush01Jrt;re!i~9=t (flflM,ijl~irJIJJj(~ ~o~.~~*~~.~~I~._.~§~~~o

Session 1l D ~~~ T ;tt~-Jfu1J1t., ffl T7tJJX; SJM~t#!A 1tffl~l¥J-jfuli1t 0 ~Jlli n~~~*~~FP~~~~*rrwm~Mo

MJ::OORffJJlJ ~~~IJ, ~T Hibernate ~~R it~.f~~~~Fnfijisa~ 1 0 fflXif-f"-ffl-tJdt-J IDEe _miJifcij;mJ-t, i!~ag~.flx~J!f.f-€tOOrtJXif.ag}~,~, ~R1"tB**~;gj7 7f1t~$o

.IV\~ Hibernate

Hibernate _ill

tE1itrmHfl:!i!ltrp, ft1fJ:iMj1-1-ftj.~WrJ, %fiX7!tffJl¥JjJl-iQ: Hibernate ~"o t£ ~--t;t{9d~, ~1fJ7~7 Hibernate Jf~fffil~tfJ~*gc~o

Hibernate ?11iffU~t~ f:k:~~ tt; ~ !¥l~ ~ , 111f 1l'-ffl Hibernate I¥J ~~m J( , nc!RfiJ !fH'i~ 0 ~JG\.~lOiWi~ttI5.#ftE Hibernate ili~~tt4ti#j£o

*1ii_:t~M.l2J- r JL-i'mI7tJ£trfrm:
• Hibernate ~iili~)('
• ~iili~~
• Hibernate OIR ~*1:
• fl~~~
• Hibernate fliQit\t~
• HQL ~ffltt*
• §)EJl~A-A:~!1 RAiJIfiJ Hibernate

.. -~-- .. -.--------------

80 ~4.

Hibernate lIitH

4.1 Hibernate .iHliBSl.

4.1 . 1 Configuration

lE:(zQ1t~, Configuration ~il!~1f~ Hibernate aq!c~ffi/mo Hibernate lEtrlM"fffl~YE

~-~~m~~~¥*ffi~, ~*A~~.~tt~m:

• ti:1i '* URL 0

• ti:1i,*ffl? 0

• fi 118 '* ffl P {!Hi1~ 0

• ti:1i,* JDBC ~i;U~(tE*ffl JDBC fKj«,*ijjfQ1m~aq'tg~ r[ ~JNDI ~IR 71-])0

• filii ,*~DC~ (dialect) t ffl-F x-t~ IEfl~ ,*t:lli!t X ~, Jt * § * 7 tt x-tt1i= IE ~ 1m W*ftt aq ~J_m, :(zo Hibernate rx~~~ ilJ*f JE ~~ '* ~~~ ~ B<J IlRM~ 0

i3:~mitt1lJl;J,tE Hibernate ftGliX1tf Chibernate.cfg.xml WG hibernate.properties) ~1JD ~ NJi:: (~.mi*:i!~2V = "Hibernate ftCW" $71- P3 3) 0

3 ~ ff] i/ilJ ffl :

Configuration config = new Configuration() .configure();

IM", Hibernate ~ § i;U1£~mr8"J CLASSPATH ~1t~ hibernate.cfg.xml xf4=*:#fjthD.~ J*J ff~, 1tXlj§~~fFffl~~mftG:lo

Configuration ~-~R~:t£~1{7. SessionFactory IM"$~~&, ~ SessionFactory ~Wtl'BIJ JtzFP, EBT~jiffi/m B!2EB Hibernate mlE{£i!3.@J1¥J SessionFactory z~, ~J1t-fttM(JL 'F X$Nxtl=t*~T~fF 0

:(zQ *::fill ~ ftffl ~lA i¥J hibernate.cfg.xml X 14=11: Xl ftG~Jt 14=, R fn ~ PI 1?J mlEftC ~Jt 1tf:~ :

File file = new File("c:\\sample\\myhibernate.xml"); Configuration config = new Configuration() .configure(file);

NlAj:jl:f:J Hibernate

" .... ~ ... -.- ... ----~ ..•.. ,-~~ .. ~---, ... ,-,.,'~"" .. ,',_. --'-"""~.- .. ' .. ,,:'"

4.1 Hibernate .fiHHASl. 81

4.1.2 SessionFactory

Sessionfactory fA N EIJ}l Session ~ 19t1 0 ~ f['] m 12J. j! 11 Configuation ~ i9tl ~ }l

SessionFactory :

Configuration config = new Configuration() .configure(); SessionFactory sessionFactory = config.buildSessionFactory();

Configuration ~{9tl config ~~t18~rul¥Jlfl:~WftG~ffi~m., ~iil SessionFactory ~Wtl* is@]" SessionFactory ~ _g~:ilI7t*, tlPii.-f'*fJEl¥JftC.nL~o

illmt£iJt, :tJ§ config I¥Jff{iiJ3f£~:f~~~jU B~BIJ}ll¥J SessionFactory ~Wtl Csessionfactory ) " 1m * tm~f£ffl ~Tai;l] J§ I¥J config ~{9IJ I¥J Sessionfactory, rm~ fA config £iT:ttJ~-1'- SessionFactory ~{9tl" 1liJf¥, :OOl*~ffl'f1 m~ijjfllJ ~1'-f£~W, }j~~ ttX1fit 1'-fltJi§ ~, ~:7t~IJ:J.J Jt,€IJ}tX11il.i¥-J SessionFactory ~Wtl 0

SessionFactory rp 1*11 7 X1 J5Y. ~ Htr~tw wnc~ e-g WT:ff fl!1cM ~ ~ , 1m B1 tB itt -fi.!P ~ iitr 1¥J=t&l'iiQi~fPlO Statement Pool a ffiJlt1iJ J\!" SessionFactory I¥JBIJ}ln~~\~~~'iitj[~" f~ 1ft- ~ ~, ffij ~ 1i! 8;t. '*~ , i1tfI'J @l ~1£~#f iiit ~ Jt: 7} ~ ~ ilJ SessionFactory l¥J:l:ffl. ~" ffi-f" SessionFactory *~ 7~:m3C~l¥Jiiit, PJffi ~1'-~W1fttiJJffl, A~ti:M-t£ r, ~1'-illZm rpftX1-1'-f;[~}ft:it*-1'- SessionFactory ~f;lJtlP-ar a

4.1 .3 Session

Session £ Hibernate ~A1t~f'FI¥J~ilto i3:.l!!t Session a<J~)(, ~ ~~tJtt)ct Web ml¥J HttpSession 1fi2:1ftt~~~o Hibernate Session Z ~ Hibernate, m~-f' JDBe Connection :ffiX1 ~ JOBCo

Session f1=:J.J11t!1 Hibernate 1¥J~~1t~JlB~J{), tl1Jt 7 i);:~~~it1J~, 1m save .. update" delete, findl~ Q Jiiil!li:h1J~, ~1n tlP PJ)!f!ij:im1GJlXX1#l¥JitJJJlJa:ft (CRUD) Q

I Hibernate 3 Sessionfl n aq~)( 9=' EJ~nm 7 find1iti: a

.IlA~ Hibernate

You might also like