You are on page 1of 49

Bo co ti tm hiu Hibernate-phn 1

Bo co tm hiu ti m ti: SE04.

HIBERNATE phn 1

I.

Component mapping. 1. Component mapping l gi? Component khng phi l mt tham chiu thc th, n ging nh mt i tng c cha trong mt i tng cha khc. N khng c id v ch tn ti khi thc th cha tn ti. Component cho php bn nhm mt vi ct vo trong mt i tng. Ta xt v d:

Ta quan st, bng AccountOwner gm cc thuc tnh: - accountOwner - lastname - firstname - socialSecuritynumber

1041349 - 1041397 - 1041444

Page 1

Bo co ti tm hiu Hibernate-phn 1

streeAddress city state zip-code home-phone cell-phone

t chc c s d liu tt hn, ngi ta s tch cc thuc tnh : StreetAddress, city, zipcode ra thnh mt n v d liu ring, vic ny gip c s d liu ca chng ta tng minh hn, r rng hn v vic truy xut n gin hn.

Cc thuc tnh sau khi c tch ra s thuc v 1 n v d liu c tn l Address. Ta c nhn xt nh sau: - Address c cha trong AccountOwner - Address ch tn ti khi AccountOwner tn ti Ni mt cch khc, Address chnh l mt component. 2. Using Component - s dng component Vic nh x t bng d liu cho component l ht sc n gin. d hiu hn, ta xt vic nh x t bng AccountOwner cho component address nh sau:

1041349 - 1041397 - 1041444

Page 2

Bo co ti tm hiu Hibernate-phn 1

C php ca mt component nh sau: Bn trong th component l th parent khai bo tn ca Cha. Tip theo l cc th property khai bo cc thuc tnh bn trong ca component. 3. Nested Components - Component lng nhau: L hin tng bn trong component cho c cha cc component con bn trong. Xt v d sau:

1041349 - 1041397 - 1041444

Page 3

Bo co ti tm hiu Hibernate-phn 1

Thuc tnh zipcode c chia lm hai phn: Zip v plus4. V du: 122221234. Nh vy thun tin, ngi ta a zipcode vo mt component nh hnh sau:

Ta thy c rng bn trong bng AccountOwner c component Address v bn trong Address c component Zipcode. y l mt v d in hnh cho vic th hin Nested component. Ta biu din file mapping nh sau:

1041349 - 1041397 - 1041444

Page 4

Bo co ti tm hiu Hibernate-phn 1

4. Mapping a component Tham chiu trong component Mt component c th c tham chiu ti i tng <parent>.

5. Collection of component

1041349 - 1041397 - 1041444

Page 5

Bo co ti tm hiu Hibernate-phn 1

6. Component as Entity ID II. Collection Mapping 1. Mapping collection of value Tp hp cc gi tr: l danh sch lu tr cc gi tr, cc kiu tham tr(String, integer,double) nhng khng phi l i tng c nh. Mapping collection of value l s tp hp ca cc gi tr. nh ngha tp hp, ta s dng th <bag>, 1 th tp hp n gin trong hibernat. Th <bag> l i tng khng theo th t, mi ci c th cha cc phn t lp li. V d v th <bag>:

2. Collection types in hibernate Ngoi th <bag> , cn c nhiu tp hp khc trong hibernate, mi loi c nhng u im v c im ring. 2.1. Association as <bag> Th <bag> l mt tp hp m trong , n c th cha cc phn t tp hp.Th <bag> thc hin thng qua Collection hoc List.
1041349 - 1041397 - 1041444 Page 6

Bo co ti tm hiu Hibernate-phn 1

Th <bag> yu cu phi c ct gi tr, c th sp xp tng gim. Th <bag> c s dng trong quan h one-many hoc many-one. Vi d v khai bo th <bag>:

2.2.

Association as <Set> Th <set>tng t nh th <bag> nhng khng cha cc phn t lp li. C th c th t hoc khng c th t, nhng i hi phi c ct gi tr. Th <Set> c th ty chn sp xp : unsort hoc natural. Th <Set> c s dng trong quan h one-many hoc many-one. V d v khai bo th <Set>:

2.3.

Association as <List> Th <List> l tp hp ch mc c kt ni, chng ta c th gi li th t ca list khi n kt ni li, do n cn phi c mt ch mc ca ct m n tham chiu ti trong bng c s d liu. <List>khc <Bag> l <List> c kt ni ch mc phn t. Th <List> c s dng trong quan h one-many hoc many-one. V d v khai bo th <List> :

1041349 - 1041397 - 1041444

Page 7

Bo co ti tm hiu Hibernate-phn 1

2.4.

Association as <Array> Th <Array> tng i ging th <List>, c mt im khc bit l th <Array> tng ng vi kiu mng trong java, cn th <List >tng ng vi kiu List. Do , khi mng khng th t ng tng gim c kch thc, ngi ta thng s dng th<List>. Th <Array> c s dng trong quan h one-many hoc many-one V d v khai bo th <Array>:

2.5.

Association as Map Th <map> gn ging nh th <List> nhng th <map> s dng kha c kiu bt k lm ch mc ch khng s dng kiu int nh th <List>. Th <map> c th c th t hoc khng c th t nhng i hi phi c kha v gi tr ct. Th <map> c s dng trong quan h one-many hoc many-one V d v khai bo th <map>:

2.6.

Association as idbag Th <idbag> s dng tng t nh th <bag> nhng n thm kh nng nhn dng thm cc key thay th. Khng th s dng th<idbag > cho c 2 mt ca quan h(manymany). Th <idbag> c s dng trong quan h many-many. V d v khai bo th <idbag>:

1041349 - 1041397 - 1041444

Page 8

Bo co ti tm hiu Hibernate-phn 1

3. Sorting the collection. 3.1. Sorting database. Khi tp hp qu ln, sp xp thun li nht, ta sp xp tp hp trong c s d liu. sp xp, ta s dng t kha orderby, vi 2 gi tr c th la chn, l asc (sp tng) v desc(sp gim). Chng ta cn ch mt iu l thuc tnh orderby khng phi l mt thuc tnh trong hibernate m ch l mt ct trong c s d liu. Sorting memory Khi kch thc khng ln, ta c th s dng phng php sp xp ny. V iu c bit ca vic sp xp ny l ch c th <map> v th <set> l c th s dng c. sp tng ta khai bo t kha sort vi ba gi tr l natural, unsort, hoc my.custom.mycomparator.

3.2.

III.

Inheritance Mapping.(Tnh k tha trong Hibernate)

c tnh ca K tha (Inheritance) D s dng trong ngn ng hng i tng(object oriented language).

Java: s dng t kha extend hay implement. Nhng li khng d s dng trong d liu quan h. Cc bng khng th extend t cc bng khc c. Vn Impedence missmatch. hiu r vn Impedence missmatch ta xem v d sau :

1041349 - 1041397 - 1041444

Page 9

Bo co ti tm hiu Hibernate-phn 1

Ta c mt m hnh d liu c 2 table: Customers v Accounts. Nh vy chng ta s to m hnh object vi 2 class tng ng vi 2 table ny:

Nhng m hnh object trn thiu tnh linh ng v kh nng m rng, do chng ta nn thit k li thm inheritance v abstraction, lm m hnh gn hn vi thc t:

Chng ta c th thy r rng s khng i xng (mismatch) gia m hnh d liu v m hnh object trong trng hp ny. Trong database, hon ton chp nhn c khi cha ton b thng tin ca Person v PersonName trong mt table Customers. Nhng tng tc thc thi, vic bo tr v s linh hot; mt object ln nn c chia thnh nhiu object nh. Vy phi gii quyt cc vn ny nh th no? Trong Hibernate ta c 4 cch gii quyt : 1. 2. 3. 4. Table per class hierachy. Table per subclass. Table per concrete class. a hnh tim n.

Xt v d sau y:

1041349 - 1041397 - 1041444

Page 10

Bo co ti tm hiu Hibernate-phn 1

Ta c 3 lp : Person, Teacher v Student. Trong Person l lp cha v Teacher , Student k tha t lp cha ny. S lp:

Table per class hierachy. Vi phng php n ta s nh x tt c cc lp vo duy nht 1 bng. tt c cc thuc tnh ca cc lp s hin th trong bng nh l mt colum, trong s c 1 ct cha cc tn lp con m ta gi l Discriminator phn bit cc lp vi nhau.

Theo bng Person trn ta thy Discriminator lc ny l ct PERSON_TYPE cha 2 trng d liu l Sutent v Teacher. y l tn ca hai lp con k tha t lp cha Person. Bng PERSON cha tt c cc thuc tnh (attributes ) ca cc lp Person, Teacher v Student nh l cc colunms ca n. Mapping cho Table class hierachy: Person.hbm.xml <hibernate-mapping> <class name=Person table=PERSON> <id name=id column=ID> <generator class=increment/> </id> <discriminator column=PERSON_TYPE type=string/> <property name= name column=NAME/>

1041349 - 1041397 - 1041444

Page 11

Bo co ti tm hiu Hibernate-phn 1

</class> </hibernate-mapping> Bng Person c cha column PERSON_TYPE. Column ny c maped (nh x) bng cch s dng th XML <discriminator> . Discriminator khng phi l thuc tnh ca bt k java class no, n ch l mt ct c dng chung gia databse v Hibernate. Mapping file cho hai lp Student v Teacher. Student.hbm.xml =============== <hibernate-mapping> <subclass name=Student extends=Person discriminator-value=Student> <property name= branch column=BRANCH/> </subclass> </hibernate-mapping> Teacher.hbm.xml =============== <hibernate-mapping> <subclass name=Teacher extends=Person discriminator-value=Teacher> <property name= department column=DEPARTMENT/> </subclass> </hibernate-mapping>

u im : Cch tip cn ny th n gin v hiu qu v tt c cc d liu th u nm trong cng mt bng nn vic kt bng lc ny th khng cn thit. Nhc im : khng th khai bo cho cc subclass rng buc NOT NULL. Table per concrete class Mt lp con l mt bng ring bit.
1041349 - 1041397 - 1041444 Page 12

Bo co ti tm hiu Hibernate-phn 1

By gi ta mapping bng <union-subclass> <union-subclass> c s dng cho mi subclass trong mapping file.

<class name="Person"> <id name="id" type="long" column="ID"> <generator class="sequence"/> </id> <property name="name" column="NAME"/> <union-subclass name="Student" table="STUDENT"> <property name="branch" column="BRANCH"/> </union-subclass> <union-subclass name="Teacher" table="TEACHER "> <property name="branch" column="BRANCH"/> </union-subclass> </class> Table per subclass: Ta to ra ba bng ring bit cho 3 lp.

1041349 - 1041397 - 1041444

Page 13

Bo co ti tm hiu Hibernate-phn 1

<joined-subclass> c s dng cho mi subclass torng mapping file. <class name="Person" table="PERSON"> <id name="id column="ID"> <generator class="native"/> </id> <property name="name" column="NAME"/> <joined-subclass name="Teacher" table="TEACHER"> <key column="ID"/> <property name="department" column="DEPARTMENT"/> </joined-subclass> <joined-subclass name="Student" table="STUDENT"> <key column="ID"/> <property name="branch" column="BRANCH"/> </joined-subclass> </class>

Trong trng hp ny ta s c 3 bng. V kha chnh ca cc subclass trng vi kha chnh ca lp cha( y kha chnh ca c 3 bng l ID). IV. Working With Object 1. vng i ca mt object trong Hibernate.

1041349 - 1041397 - 1041444

Page 14

Bo co ti tm hiu Hibernate-phn 1

Cc objects m Hibernate qun l phi lun lun mt trong bn trng thi(STATE) sau y: 1. 2. 3. 4. Transient. Persisten. Removed. Detatched.

Cc Objects mun chuyn t trng thi ny sang trng thi khc s c thc hin thng qua cc phng thc khc nhau. Transient State_ Trng thi tm thi. Tt c cc i tng khi mi khi to u trng thi Transient. Account account = new Account(); i tng account va c ta khi to cho nn account by gi ang trng thi tm thi m thi. c im ca cc i tng khi ang trng thi Transient State: Hibernate khng th nhn ra cc i tng ny . Cc i tng ny khng h c bt k lin quan n cc d liu c trong database. Do khng c gi tr cho accountID.(accountID l kha chnh.) Khi i tng mi khi to ny khng lin quan n bt k i tng no khc th n s c hy bi c ch thu gom rc(garbage collected).

PERSISTENT STATE_Trng thi n nh . Vi cc i tng trng thi ny th n c cc c im sau: c nhn bit v chu s qun l ca Hibernate. C mt database id l mt i tng c tn ti bng vic ly ln t database. Hay l mt i tng ang trng thi tm thi (Transient State) nhng c lu.

1041349 - 1041397 - 1041444

Page 15

Bo co ti tm hiu Hibernate-phn 1

y l trng thi duy nht m cc objecs c lu vo database. Ni cch khc khi mt object mun c lu vo databse iu u tin l n phi ang trng thi Persisent. Vic chnh sa, cp nht trn mt i tng ang trang thi khc trng thi ny s KHNG c lu li vo database . Trong khi khi ta lm vic vi mt i tng ang trng thi Persistent th vic thay i ca i tng ny s c t ng cp nht xung databse m khng cn gi bt k phng thc Session Persistent no. cc i tng c to ra n nh , lu bn thng qua cc Hibernate session: session.save(account); session.update(account); session.lock(account); session.merge(account); Ta xem v d sau y:

1041349 - 1041397 - 1041444

Page 16

Bo co ti tm hiu Hibernate-phn 1

u tin ta thy khi mi khi to i tng account thng qua phng thc new Account() th accoount lc ny ang trng thi tm thi m thi(Transient state). Hibernate khng lm vic trn account n gin v n khng hiu account l g. Vy Hibernate hiu v lm vic trn account ta phi chuyn n v trng thi Persistent thng qua session . Lc ny vic cp nht, thay i ta lm trn account s c Hibernate t ng lu xung databse. REMOVE STATE. Xt i tng ang trng thi Persistent. Remove state l trng thi m m i tng ny b delete ra khi database. session.delete(account); Lc ny mi thay i trn i tng ny s khng cn c lu xung database na. C ch thu gom rc ca Hibernate s dn dp i tng ny bi v Hibernate khng cho php tn ti mt i tng rng.(i tng khng lu tr bt k thng tin g.) Xt v d sau y:

u tin khi to mt phin lm vic cho Hibernate(session)

1041349 - 1041397 - 1041444

Page 17

Bo co ti tm hiu Hibernate-phn 1

Sau ta ly ln mt account vi id = 1 . Lc ny account c tr ra trong trng thi Persistent. Tip ta tin hnh delete account i. Lc ny mi chnh sa trn account s b Hibernate l i v account hin ti ang trng thi Remove. Ch rng trong Java th i tng account lc ny s vn cn alive, tc l ta c th gn gi tr cho n, lm vic vi n nh mt i tng bnh thng d b delete ra khi databse v i tng ny s alive cho n khi no lp trnh vin set n null hoc hy n i. DETACHED STATE Mt i tng persistent s vn cn c tham chiu sau khi session ca n ng li. Phng thc session.close() thay i trng thi ca i tng t Persistent sang Detached. c tnh: i tng lc ny vn i din cho hng d liu m n ang mang trong databse. Nhng khng thuc s qun l ca Hibernate na. Lc ny mi s thay i trn detached object s khng cn c lu xung database . C th redetached ( kt ni li) tr v trng thi Persistent cho i tng v gy ra hin tng l lu li trng thi ca chnh n xung database. update(); merge(); lock(); // ta retach() nhng s khng lu trng thi .

Xt v d sau :

1041349 - 1041397 - 1041444

Page 18

Bo co ti tm hiu Hibernate-phn 1

u tin khi to session1. To i tng account thng qua session1. Sau ng session1 li. Lc ny account ang trng thi Detached State. By gi ta mun tr li trng thi Persistent cho n th ta re-attach li thng qua vic m ra mt phin lm vic mi tc l to ra session2. HIBERNATE LIFECYCLE

1041349 - 1041397 - 1041444

Page 19

Bo co ti tm hiu Hibernate-phn 1

V.

Association Mapping 1. Gii thiu Trnh by cc mi quan h thng l iu kh khn nht th hin mt cch chnh xc. Trong phn ny, chng ta xem xt mt s trng hp thng dng, bt u vi mi quan h mt chiu v sau l hai chiu. 2. Cc mi quan h thng dng 2.1. Quan h mt chiu (unidirectional association): a. Nhiu Mt : Quan h Nhiu Mt l loi quan h ph bin nht trong cc mi quan h. Mi mt cn nh (c a ch) thuc v mt c nhn, mi c nhn c th c nhiu cn nh. Mi quan h hng t cn nh ( c a ch ) n c nhn l mi quan h Nhiu Mt.

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <many-to-one name="address" column="addressId" not-null="true"/> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> b. Mt Mt : Mi quan h mt mt ging nh mi quan h Nhiu Nhiu nhng c them thuc tnh Unique = true

1041349 - 1041397 - 1041444

Page 20

Bo co ti tm hiu Hibernate-phn 1

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <many-to-one name="address" column="addressId" unique="true" not-null="true"/> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> Hoc ta c th s dng cch khc di y <class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> </class>

<class name="Address"> <id name="id" column="personId"> <generator class="foreign"> <param name="property">person</param> </generator> </id>

1041349 - 1041397 - 1041444

Page 21

Bo co ti tm hiu Hibernate-phn 1

<one-to-one name="person" constrained="true"/> c. Mt Nhiu : Mi quan h Mt Nhiu l mt mi quan h khng thng dng v t c gii thiu.

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <set name="addresses"> <key column="personId" not-null="true"/> <one-to-many class="Address"/> </set> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> Bn nn thay th dng mt bng tham gia trong trng hp ny. 2.2. Quan h mt chiu c dng bng tham gia : a. Mt - Nhiu : Mi quan h Mt - Nhiu vi bng tham gia l u tin la chn. Ch r unique = true chuyn t quan h Nhiu Nhiu sang quan h Mt - Nhiu.

<class name="Person"> <id name="id" column="personId">


1041349 - 1041397 - 1041444 Page 22

Bo co ti tm hiu Hibernate-phn 1

<generator class="native"/> </id> <set name="addresses" table="PersonAddress">// bng tham gia <key column="personId"/> <many-to-many column="addressId" unique="true" class="Address"/> </set> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> b. Nhiu Mt : Quan h Nhiu Mt vi mt bng tham gia l mi quan h ph bin khi mi quan h l tu chn.

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <join table="PersonAddress" optional="true">// tu chn <key column="personId" unique="true"/> <many-to-one name="address" column="addressId" not-null="true"/> </join>
1041349 - 1041397 - 1041444 Page 23

Bo co ti tm hiu Hibernate-phn 1

</class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> c. Mt Mt : Quan h Mt Mt vi mt bng tham gia l quan h c th s dng nhng chi trong cc trng hp cc k c bit.

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <join table="PersonAddress" optional="true"> <key column="personId" unique="true"/> <many-to-one name="address" column="addressId" not-null="true" unique="true"/> </join> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/>


1041349 - 1041397 - 1041444 Page 24

Bo co ti tm hiu Hibernate-phn 1

</id> d. Nhiu Nhiu : Quan h Nhiu - Nhiu c bng tham gia l mt in hnh trong cc mi quan h

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <set name="addresses" table="PersonAddress"> <key column="personId"/> <many-to-many column="addressId" class="Address"/> </set> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id>

2.3.

Quan h hai chiu (bidirectional association) : a. Mt Nhiu / Nhiu Mt : Quan h hai chiu Nhiu Mt l quan h ph bin nht.

<class name="Person"> <id name="id" column="personId"> <generator class="native"/>


1041349 - 1041397 - 1041444 Page 25

Bo co ti tm hiu Hibernate-phn 1

</id> <many-to-one name="address" column="addressId" not-null="true"/> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> <set name="people" inverse="true"> <key column="addressId"/> <one-to-many class="Person"/> </set>

Nu bn s dng mt danh sch, hoc lp ch mc th thit lp cc ct quan trng vi kho ngoi khng phi null. Hibernate s qun l cc lin kt t cc pha duy tr ch s ca mi phn t vi thit lp update = false v insert = false

<class name="Person"> <id name="id"/> ... <many-to-one name="address" column="addressId" not-null="true" insert="false" update="false"/>

1041349 - 1041397 - 1041444

Page 26

Bo co ti tm hiu Hibernate-phn 1

</class>

<class name="Address"> <id name="id"/> ... <list name="people"> <key column="addressId" not-null="true"/> <list-index column="peopleIdx"/> <one-to-many class="Person"/> </list>

b. Mt Mt : Quan h Mt Mt hai hng l quan h ph bin.

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <many-to-one name="address" column="addressId" unique="true" not-null="true"/> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> <one-to-one name="person"

1041349 - 1041397 - 1041444

Page 27

Bo co ti tm hiu Hibernate-phn 1

property-ref="address"/>

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <one-to-one name="address"/> </class>

<class name="Address"> <id name="id" column="personId"> <generator class="foreign"> <param name="property">person</param> </generator> </id> <one-to-one name="person" constrained="true"/>

2.4.

Quan h hai chiu vi bng tham gia: a. Mt Nhiu / Nhiu Mt :

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <set name="addresses"

1041349 - 1041397 - 1041444

Page 28

Bo co ti tm hiu Hibernate-phn 1

table="PersonAddress"> <key column="personId"/> <many-to-many column="addressId" unique="true" class="Address"/> </set> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> <join table="PersonAddress" inverse="true" optional="true"> <key column="addressId"/> <many-to-one name="person" column="personId" not-null="true"/> </join> b. Mt Mt :

<class name="Person"> <id name="id" column="personId"> <generator class="native"/> </id> <join table="PersonAddress"

1041349 - 1041397 - 1041444

Page 29

Bo co ti tm hiu Hibernate-phn 1

optional="true"> <key column="personId" unique="true"/> <many-to-one name="address" column="addressId" not-null="true" unique="true"/> </join> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> <join table="PersonAddress" optional="true" inverse="true"> <key column="addressId" unique="true"/> <many-to-one name="person" column="personId" not-null="true" unique="true"/> </join> c. Nhiu Nhiu :

<class name="Person">

1041349 - 1041397 - 1041444

Page 30

Bo co ti tm hiu Hibernate-phn 1

<id name="id" column="personId"> <generator class="native"/> </id> <set name="addresses" table="PersonAddress"> <key column="personId"/> <many-to-many column="addressId" class="Address"/> </set> </class>

<class name="Address"> <id name="id" column="addressId"> <generator class="native"/> </id> <set name="people" inverse="true" table="PersonAddress"> <key column="addressId"/> <many-to-many column="personId" class="Person"/> </set>

VI.

Batch processing Batch process l qu trnh thc thi cng mt lc mt lot cc chng trnh. Trong sut qu trnh thc thi Batch process ta cn thm xa sa mt lng ln d liu, iu ny c th lm trn b nh tm ca Hibernate (Outofmemmory).

1041349 - 1041397 - 1041444

Page 31

Bo co ti tm hiu Hibernate-phn 1

gii quyt vn ny, ta s dng phng thc flush() v clear() xa b nh tm sau mi 100 n 200 dng d liu. Hai phng thc ny gii phng b nh tm mc 1. Ngc li, nu b nh tm mc hai c s dng ( Mc Entity), ta phi tt chc nng ny bng cu lnh : Sessesion.setCacheMode(CacheMode.IGNOR) cp ton cc, ta c th thit lp kch thc mi khi x l cho JDBC bng thuc tnh : jdbc.Batch_Size Tt b nh tm mc hai bng trong file Mapping bng cch t thuc tnh Cach.use_second_level_cache v false. 1. Batch insert

thm 100000 dng d liu ta lm cc vic nh sau : ng k phin lm vic Session. Tin hnh insert d liu. Kim tra v dung hai phng thc flush() v Cleart() xa b nh tm mc mt. 2. Batch Update batch Delete 2.1. S dng Scroll S dng hai phng thc flush() v clear() xa b nh tm mc mt v lu thnh khi. Dng Scroll ly v mt JDBC Result (ScrollableResults) v update hoc Delete tng row.

1041349 - 1041397 - 1041444

Page 32

Bo co ti tm hiu Hibernate-phn 1

Hiu chnh CacheMode.IGNORE Hibernate khng tng tc vi b nh tm mc hai trong mt session ring.

2.2.

S dng cu truy vn C php :

Mnh FROM v WHERE c ty chn. Mnh FROM ch t tn cho thc th n. Khng h tr t kha JOIN. Ta c v d :

1041349 - 1041397 - 1041444

Page 33

Bo co ti tm hiu Hibernate-phn 1

UPDATE:

DELETE :

Inheritance Mapping.(Tnh k tha trong Hibernate) c tnh ca K tha (Inheritance) D s dng trong ngn ng hng i tng(object oriented language).

Java: s dng t kha extend hay implement. Nhng li khng d s dng trong d liu quan h. Cc bng khng th extend t cc bng khc c. Vn Impedence missmatch. hiu r vn Impedence missmatch ta xem v d sau : Ta c mt m hnh d liu c 2 table: Customers v Accounts.
1041349 - 1041397 - 1041444 Page 34

Bo co ti tm hiu Hibernate-phn 1

Nh vy chng ta s to m hnh object vi 2 class tng ng vi 2 table ny:

Nhng m hnh object trn thiu tnh linh ng v kh nng m rng, do chng ta nn thit k li thm inheritance v abstraction, lm m hnh gn hn vi thc t:

Chng ta c th thy r rng s khng i xng (mismatch) gia m hnh d liu v m hnh object trong trng hp ny. Trong database, hon ton chp nhn c khi cha ton b thng tin ca Person v PersonName trong mt table Customers. Nhng tng tc thc thi, vic bo tr v s linh hot; mt object ln nn c chia thnh nhiu object nh. Vy phi gii quyt cc vn ny nh th no? Trong Hibernate ta c 4 cch gii quyt :

1041349 - 1041397 - 1041444

Page 35

Bo co ti tm hiu Hibernate-phn 1

5. 6. 7. 8.

Table per class hierachy. Table per subclass. Table per concrete class. a hnh tim n. Xt v d sau y: Ta c 3 lp : Person, Teacher v Student. Trong Person l lp cha v Teacher , Student k tha t lp cha ny. S lp:

Table per class hierachy. Vi phng php n ta s nh x tt c cc lp vo duy nht 1 bng. tt c cc thuc tnh ca cc lp s hin th trong bng nh l mt colum, trong s c 1 ct cha cc tn lp con m ta gi l Discriminator phn bit cc lp vi nhau.

Theo bng Person trn ta thy Discriminator lc ny l ct PERSON_TYPE cha 2 trng d liu l Sutent v Teacher. y l tn ca hai lp con k tha t lp cha Person. Bng PERSON cha tt c cc thuc tnh (attributes ) ca cc lp Person, Teacher v Student nh l cc colunms ca n. Mapping cho Table class hierachy: Person.hbm.xml <hibernate-mapping> <class name=Person table=PERSON> <id name=id column=ID>

1041349 - 1041397 - 1041444

Page 36

Bo co ti tm hiu Hibernate-phn 1

<generator class=increment/> </id> <discriminator column=PERSON_TYPE type=string/> <property name= name column=NAME/> </class> </hibernate-mapping> Bng Person c cha column PERSON_TYPE. Column ny c maped (nh x) bng cch s dng th XML <discriminator> . Discriminator khng phi l thuc tnh ca bt k java class no, n ch l mt ct c dng chung gia databse v Hibernate. Mapping file cho hai lp Student v Teacher. Student.hbm.xml =============== <hibernate-mapping> <subclass name=Student extends=Person discriminator-value=Student> <property name= branch column=BRANCH/> </subclass> </hibernate-mapping> Teacher.hbm.xml =============== <hibernate-mapping> <subclass name=Teacher extends=Person discriminator-value=Teacher> <property name= department column=DEPARTMENT/> </subclass> </hibernate-mapping>

u im : Cch tip cn ny th n gin v hiu qu v tt c cc d liu th u nm trong cng mt bng nn vic kt bng lc ny th khng cn thit. Nhc im : khng th khai bo cho cc subclass rng buc NOT NULL. Table per concrete class
1041349 - 1041397 - 1041444 Page 37

Bo co ti tm hiu Hibernate-phn 1

Mt lp con l mt bng ring bit.

By gi ta mapping bng <union-subclass> <union-subclass> c s dng cho mi subclass trong mapping file.

<class name="Person"> <id name="id" type="long" column="ID"> <generator class="sequence"/> </id> <property name="name" column="NAME"/> <union-subclass name="Student" table="STUDENT"> <property name="branch" column="BRANCH"/> </union-subclass> <union-subclass name="Teacher" table="TEACHER "> <property name="branch" column="BRANCH"/> </union-subclass> </class> Table per subclass: Ta to ra ba bng ring bit cho 3 lp.

1041349 - 1041397 - 1041444

Page 38

Bo co ti tm hiu Hibernate-phn 1

<joined-subclass> c s dng cho mi subclass torng mapping file.

<class name="Person" table="PERSON"> <id name="id column="ID"> <generator class="native"/> </id> <property name="name" column="NAME"/> <joined-subclass name="Teacher" table="TEACHER"> <key column="ID"/> <property name="department" column="DEPARTMENT"/> </joined-subclass> <joined-subclass name="Student" table="STUDENT"> <key column="ID"/> <property name="branch" column="BRANCH"/> </joined-subclass> </class>

Trong trng hp ny ta s c 3 bng. V kha chnh ca cc subclass trng vi kha chnh ca lp cha( y kha chnh ca c 3 bng l ID). WORKING WITH OBJECT 1.vng i ca mt object trong Hibernate.

1041349 - 1041397 - 1041444

Page 39

Bo co ti tm hiu Hibernate-phn 1

Cc objects m Hibernate qun l phi lun lun mt trong bn trng thi(STATE) sau y: 5. 6. 7. 8. Transient. Persisten. Removed. Detatched.

Cc Objects mun chuyn t trng thi ny sang trng thi khc s c thc hin thng qua cc phng thc khc nhau. Transient State_ Trng thi tm thi. Tt c cc i tng khi mi khi to u trng thi Transient. -Account account = new Account(); i tng account va c ta khi to cho nn account by gi ang trng thi tm thi m thi. c im ca cc i tng khi ang trng thi Transient State: Hibernate khng th nhn ra cc i tng ny . Cc i tng ny khng h c bt k lin quan n cc d liu c trong database. o Do khng c gi tr cho accountID.(accountID l kha chnh.)

-khi i tng mi khi to ny khng lin quan n bt k i tng no khc th n s c hy bi c ch thu gom rc(garbage collected).

PERSISTENT STATE_Trng thi n nh . Vi cc i tng trng thi ny th n c cc c im sau: -c nhn bit v chu s qun l ca Hibernate. - C mt database id -l mt i tng c tn ti bng vic ly ln t database. - hay l mt i tng ang trng thi tm thi (Transient State) nhng c lu.

1041349 - 1041397 - 1041444

Page 40

Bo co ti tm hiu Hibernate-phn 1

-y l trng thi duy nht m cc objecs c lu vo database. Ni cch khc khi mt object mun c lu vo databse iu u tin l n phi ang trng thi Persisent. -vic chnh sa, cp nht trn mt i tng ang trang thi khc trng thi ny s KHNG c lu li vo database . - trong khi khi ta lm vic vi mt i tng ang trng thi Persistent th vic thay i ca i tng ny s c t ng cp nht xung databse m khng cn gi bt k phng thc Session Persistent no. - cc i tng c to ra n nh , lu bn thng qua cc Hibernate session: -session.save(account); -session.update(account); -session.lock(account); -session.merge(account); Ta xem v d sau y:

u tin ta thy khi mi khi to i tng account thng qua phng thc new Account() th accoount lc ny ang trng thi tm thi m thi(Transient state). Hibernate khng lm vic trn account n gin v n khng hiu account l g. Vy Hibernate hiu v lm vic trn account ta phi chuyn n v trng thi Persistent thng qua session . Lc ny vic cp nht, thay i ta lm trn account s c Hibernate t ng lu xung databse.

1041349 - 1041397 - 1041444

Page 41

Bo co ti tm hiu Hibernate-phn 1

REMOVE STATE. Xt i tng ang trng thi Persistent. Remove state l trng thi m m i tng ny b delete ra khi database. -session.delete(account); Lc ny mi thay i trn i tng ny s khng cn c lu xung database na. C ch thu gom rc ca Hibernate s dn dp i tng ny bi v Hibernate khng cho php tn ti mt i tng rng.(i tng khng lu tr bt k thng tin g.) Xt v d sau y:

u tin khi to mt phin lm vic cho Hibernate(session) Sau ta ly ln mt account vi id = 1 . Lc ny account c tr ra trong trng thi Persistent. Tip ta tin hnh delete account i. Lc ny mi chnh sa trn account s b Hibernate l i v account hin ti ang trng thi Remove. Ch rng trong Java th i tng account lc ny s vn cn alive, tc l ta c th gn gi tr cho n, lm vic vi n nh mt i tng bnh thng d b delete ra khi

1041349 - 1041397 - 1041444

Page 42

Bo co ti tm hiu Hibernate-phn 1

databse v i tng ny s alive cho n khi no lp trnh vin set n null hoc hy n i. DETACHED STATE Mt i tng persistent s vn cn c tham chiu sau khi session ca n ng li. Phng thc session.close() thay i trng thi ca i tng t Persistent sang Detached. c tnh: i tng lc ny vn i din cho hng d liu m n ang mang trong databse. Nhng khng thuc s qun l ca Hibernate na. Lc ny mi s thay i trn detached object s khng cn c lu xung database . C th redetached ( kt ni li) tr v trng thi Persistent cho i tng v gy ra hin tng l lu li trng thi ca chnh n xung database. update(); merge(); lock(); // ta retach() nhng s khng lu trng thi .

Xt v d sau :

1041349 - 1041397 - 1041444

Page 43

Bo co ti tm hiu Hibernate-phn 1

u tin khi to session1. To i tng account thng qua session1. Sau ng session1 li. Lc ny account ang trng thi Detached State. By gi ta mun tr li trng thi Persistent cho n th ta re-attach li thng qua vic m ra mt phin lm vic mi tc l to ra session2.

HIBERNATE LIFECYCLE

1041349 - 1041397 - 1041444

Page 44

Bo co ti tm hiu Hibernate-phn 1

READ ONLY ENTITIES Trc ht ta cn hiu qua cc khi nim sau y: Th no l entity: Hibernate phn chia Object thnh hai loi : 1. Entity Types : loi thc th. 2. Value Types : loi gi tr. Entity object ging nh phn u ca mt object. Mt entity object s c mt nh danh ID dnh ca ring n(kha chnh _Primary key) trong database. Entity object cng c vng i nh mt object bnh thng (Transient_Persistent_Remove_Detach). V n cng c cc mi quan h kt hp vi cc object khc. V d ta c mt object tn l Team, object ny c quan h mt hay nhiu vi mt object khc tn l BallPlayer( Ngha l mt Team s c mt hay nhiu

1041349 - 1041397 - 1041444

Page 45

Bo co ti tm hiu Hibernate-phn 1

BallPlayer) . Lc ny BallPlayer object l mt object thuc loi entiy Type trong Hibernate.

theo nh hnh min ha trn ta thy c rng cc Entity type c nh danh duy nht ca ring mnh , v n chnh l mt dng trong bng d liu BallPlayer. Value object : C c tnh ca value object: -Khng c nh danh ID trong database nh entity object. - Cc value object thuc v mt entity object no . Tui th ca cc value object ph thuc vo thc th m n ang thuc v. Cc loi d liu m value object c th c l : String(chui);Date(ngy thng); Integer(s nguyn);. Dirty Checking trong Hibernate: Khi mt Persistent object c update th Hibernate s t ng udate nhng thay i trn i tng xung database. Qu trnh thc hin xung database ca Hibernate c gi l dirty-check. -Khi no th thc th (entity) l read-only: - Hibernate khng thc hin dirty-check i vi thc th na. Trong mt s trng hp, Hibernate cng lm vic vi cc entity object ny nh cc entyti object m khng phi l read-only.
1041349 - 1041397 - 1041444 Page 46

Bo co ti tm hiu Hibernate-phn 1

Mt read-only entity c th b delete. Hibernat thc hin c vic ti u ha ca mnh thng qua cc read-only entity: N tit kim c thi gian do khng khng cn phi dirty-check cc entity ny. N tit kim c b nh qua vic xa cc read-only entity.

1. Lm cho mt persistent entity tr thnh read-only: Nn nh rng ch khi entity ang trang thi persistent(trang thi n nh) th ta mi c th chuyn n thnh read only c. Nu n ang trang thi Transient hay detched th ta phi chuyn n sang trng thi persistent trc , sau ta mi c th chuyn sang read only. Hibernate cung cp cc cch sau y lm cho entity chuyn sang read-only: C th nh x entity class l immutalbe( khng thay i) ; khi mt th thc entity nm trong mt immutable class th n c persistent ri , lc ny Hibernate s t ng lm cho n read only. Ta c th thay i tnh trrng mc nh,default, nn khi ta cc entity c load ln trong session th Hibernate s t ng lm cho n read-only. Cch khc ta c th thc hin cu HQL(Hibernate Query Language) query hoc HQL criteria ch cho php c nn khi cc entity c load ln trong khi thc hin cu truy vn hay criteria nh excute, scroll, hay l iterates , th cc entity ny s c t ng chuyn thnh read only. Hoc ta c th chuyn n sang read only bng cch gi thc hin trong session. By gi chng ta s xem xt tng cch chuyn entity thnh read only do Hibertnate cung cp m ta ni trn. Entities of immutable classes S dng t kha mutable trong file mapping. mutable = false : immutable.

1041349 - 1041397 - 1041444

Page 47

Bo co ti tm hiu Hibernate-phn 1

<!-- Stock.hbm.xml --> ... <hibernate-mapping> <class name="com.mkyong.common.Stock" table="stock" mutable="false" > <set name="stockDailyRecords" mutable="false" cascade="all" inverse="true" lazy="true" table="stock_daily_record" > <key> <column name="STOCK_ID" not-null="true" /> </key> <one-to-many class="com.mkyong.common.StockDailyRecord" /> </set> </class> ... </hibernate-mapping>

Loading persistent entities as read-only ta chuyn entity sang read only qua session: 1. S dng phng thc setDefaultReadOnly Session.setDefaultReadOnly( true );

2. S dng isDefaultReadOnly Session.isDefaultReadOnly();

Loading read-only entities from an HQL query/criteria Trong HQL query ta gi hm: Query.setReadOnly( true );

1041349 - 1041397 - 1041444

Page 48

Bo co ti tm hiu Hibernate-phn 1

Trong HQL criteria : Criteria.setReadOnly( true );

1041349 - 1041397 - 1041444

Page 49

You might also like