1。面向設(shè)計(jì)的映射:
  使用組件(無id的實(shí)體類),把一些信息歸類
?1<component?name="contact"?class="entiy.Contact">
?2??????????<property
?3????????????name="addr"
?4????????????type="string"
?5????????????column="addr"????
?6????????/>
?7????????<property
?8????????????name="tel"
?9????????????type="string"
10????????????column="tel"????
11????????/>
12??
13????????</component>
14


2。面向性能的映射:?
? 在hibernate 3中使用延遲加載技術(shù);?
? 在hiberntae2中采用繼承方法,把數(shù)據(jù)大的字段分派在子類中,父類只保留簡(jiǎn)單字段即可;同時(shí),配置文件更改

?1<class
?2????????name="parent"
?3????????table="Tuser"
?4????????optimistic-lock="version"
?5????>
?6
?7????????<id
?8????????????name="id"
?9????????????column="id"
10????????????type="int"
11????????????unsaved-value="0"
12????????>
13???????????<generator?class="sequence">
14????????????????<param?name="sequence">TUSER_SEQ</param>
15????????????</generator>
16????????</id>
17
18????????<property
19????????????name="name"
20????????????type="string"
21????????????column="name"
22????????????????????/>
23????????

?1<class
?2????????name="children"
?3????????table="Tuser"
?4????????optimistic-lock="version"
?5????????polymorphism="explicit"?????? //指名這個(gè)類是個(gè)多態(tài),只有則指定類是才會(huì)查詢,否則不會(huì)查詢(如:from object),只會(huì)查詢parent,只有(from children)才會(huì)查旬
?6????>
?7
?8????????<id
?9????????????name="id"
10????????????column="id"
11????????????type="int"
12????????????unsaved-value="0"
13????????>
14???????????<generator?class="sequence">
15????????????????<param?name="sequence">TUSER_SEQ</param>
16????????????</generator>????
17????????</id>
18
19????????<property
20????????????name="name"
21????????????type="string"?
22????????????column="name"
23???????????????????/>
24
25
26???????????<property
27????????????name="blog"
28????????????type="blog"?
29????????????column="blog"
30???????????????????/>
31
32????????


hibernate 加載機(jī)制:
1。延遲加載: 這個(gè)比較常用,即在用到關(guān)聯(lián)數(shù)據(jù)時(shí)才進(jìn)行查詢。<lazy="true">
在hibernate2中默認(rèn)為false,但在hibernate3中默認(rèn)為ture,
因?yàn)檫@點(diǎn)我曾經(jīng)有過一段常時(shí)間的困惑

1select?tuser0_.id?as?id0_0_,?tuser0_.name?as?name0_0_,?tuser0_.addr?as?addr0_0_,?tuser0_.tel?as?tel0_0_?from?Tuser?tuser0_?where?tuser0_.id=?
?
當(dāng)時(shí)用到延遲加載時(shí),hibernate使用代理類動(dòng)態(tài)的創(chuàng)建對(duì)象,真正的對(duì)象位于CGLIB$CALLBACK$TARGET對(duì)象中,我們獲得的對(duì)象是一個(gè)CGLIB代理類,只有當(dāng)真正用到數(shù)據(jù)時(shí),代理類才會(huì)檢查被代理對(duì)象是否存在,如存在,返回被代理對(duì)象數(shù)據(jù),如不存在,則去進(jìn)行hibernate查詢


在集合屬性查詢時(shí),如果使用了延遲加載,則當(dāng)session關(guān)閉后,是無法得到集合屬性的,我們可以通過Hibernate.initialize()強(qiáng)制加載集合對(duì)象


2.即時(shí)加載: 查詢時(shí)同時(shí)做一次對(duì)關(guān)聯(lián)數(shù)據(jù)的查詢<lazy="false">

Hibernate:?select?tuser0_.id?as?id0_0_,?tuser0_.name?as?name0_0_,?tuser0_.addr?as?addr0_0_,?tuser0_.tel?as?tel0_0_?from?Tuser?tuser0_?where?tuser0_.id=?
Hibernate:?select?games0_.userid?as?userid1_,?games0_.id?as?id1_,?games0_.id?as?id1_0_,?games0_.name?as?name1_0_,?games0_.userid?as?userid1_0_?from?Tgame?games0_?where?games0_.userid
=?


即時(shí)加載時(shí),當(dāng)調(diào)用session.load()時(shí)hibernate執(zhí)行一次數(shù)據(jù)庫查詢,然后直接賦值給對(duì)象
3.預(yù)先加載:通過out jion 進(jìn)行抓取,不適合一對(duì)多等查詢


4。批量加載
在批量處理時(shí),一級(jí)緩存會(huì)把所有處理數(shù)據(jù)對(duì)象納入一級(jí)緩存,如過數(shù)據(jù)過多,則會(huì)導(dǎo)致內(nèi)存益處。解決辦法就是用批量提交的方法


<property?name="hibernate.jdbc.batch_size">3</property>