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,
因為這點我曾經有過一段常時間的困惑
1
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使用代理類動態的創建對象,真正的對象位于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>