1。面向設計的映射:
  使用組件(無id的實體類),把一些信息歸類
?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中使用延遲加載技術;?
? 在hiberntae2中采用繼承方法,把數據大的字段分派在子類中,父類只保留簡單字段即可;同時,配置文件更改

?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"?????? //指名這個類是個多態,只有則指定類是才會查詢,否則不會查詢(如:from object),只會查詢parent,只有(from children)才會查旬
?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 加載機制:
1。延遲加載: 這個比較常用,即在用到關聯數據時才進行查詢。<lazy="true">
在hibernate2中默認為false,但在hibernate3中默認為ture,
因為這點我曾經有過一段常時間的困惑

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=?
?
當時用到延遲加載時,hibernate使用代理類動態的創建對象,真正的對象位于CGLIB$CALLBACK$TARGET對象中,我們獲得的對象是一個CGLIB代理類,只有當真正用到數據時,代理類才會檢查被代理對象是否存在,如存在,返回被代理對象數據,如不存在,則去進行hibernate查詢


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


2.即時加載: 查詢時同時做一次對關聯數據的查詢<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
=?


即時加載時,當調用session.load()時hibernate執行一次數據庫查詢,然后直接賦值給對象
3.預先加載:通過out jion 進行抓取,不適合一對多等查詢


4。批量加載
在批量處理時,一級緩存會把所有處理數據對象納入一級緩存,如過數據過多,則會導致內存益處。解決辦法就是用批量提交的方法


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