1. 建立域模型和關(guān)系數(shù)據(jù)模型有著不同的出發(fā)點(diǎn):域模型是由程序代碼組成的,通過(guò)細(xì)化持久化類的粒度來(lái)提高代碼可重用性,簡(jiǎn)化編程;而關(guān)系數(shù)據(jù)模型是由關(guān)系數(shù)據(jù)組成的,在存在數(shù)據(jù)冗余的情況下,可以把粗粒度的表拆分成具有外鍵參照關(guān)系的幾個(gè)細(xì)粒度表,此外在沒(méi)有數(shù)據(jù)冗余的情況下應(yīng)該盡可能減少表的數(shù)目,簡(jiǎn)化表之間的參照關(guān)系。
域模型中的聚集aggregation對(duì)象關(guān)系在關(guān)系數(shù)據(jù)模型中可以通過(guò)映射為組成關(guān)系來(lái)提高代碼和數(shù)據(jù)庫(kù)訪問(wèn)質(zhì)量。比如說(shuō)一個(gè)customer具有homeAddress和comAddress屬性,從域模型出發(fā),應(yīng)該把homeAddress和comAddress抽取出來(lái)成為一個(gè)過(guò)程對(duì)象。而在關(guān)系數(shù)據(jù)模型中可以通過(guò)hibernate提供的組成關(guān)系進(jìn)行映射。映射文件如下:
而有一點(diǎn)要格外注意的是,域模型的組成對(duì)象homeAddress和comAddress對(duì)象除了具有一般的屬性成員變量外,需要為hibernate提供一個(gè)parent屬性,如下所示
hibernate提供的這種組成關(guān)系映射允許嵌套使用
2. 區(qū)分值value類型和實(shí)體Entity類型
Hibernate把持久化類的屬性分為value和Entity類型。前者沒(méi)有OID,不能被單獨(dú)持久化,不能單獨(dú)通過(guò)session加載,它的生命周期依賴于所屬的持久化類的對(duì)象生命周期,組件類型就是一種類型;而后者有OID,可以被單獨(dú)持久化。在通過(guò)Configuration類的addClass()方法加載映射文件時(shí),只需要加載與value類型對(duì)應(yīng)的實(shí)體類型,而不需要單獨(dú)加載組件類。當(dāng)通過(guò)hibernate進(jìn)行數(shù)據(jù)庫(kù)操作的時(shí)候,hibernate會(huì)自動(dòng)把組件類的屬性轉(zhuǎn)換為實(shí)體類的屬性,從而和table的列對(duì)應(yīng)起來(lái)
域模型中的聚集aggregation對(duì)象關(guān)系在關(guān)系數(shù)據(jù)模型中可以通過(guò)映射為組成關(guān)系來(lái)提高代碼和數(shù)據(jù)庫(kù)訪問(wèn)質(zhì)量。比如說(shuō)一個(gè)customer具有homeAddress和comAddress屬性,從域模型出發(fā),應(yīng)該把homeAddress和comAddress抽取出來(lái)成為一個(gè)過(guò)程對(duì)象。而在關(guān)系數(shù)據(jù)模型中可以通過(guò)hibernate提供的組成關(guān)系進(jìn)行映射。映射文件如下:
1
<component name="homeAddress" class="com.homeAddress">
2
<parent name="customer"/>
3
<property name="street" type="String" column="HOME_STREET"/>
4
<property name="city" type="String" column="HOME_CITY"/>
5

6
</component>
這樣進(jìn)行映射后,并不需要為homeAddress和comAddress單獨(dú)設(shè)置數(shù)據(jù)庫(kù)表,應(yīng)該把homeAddress和comAddress的屬性都和customer表放在一起
2

3

4

5


6

而有一點(diǎn)要格外注意的是,域模型的組成對(duì)象homeAddress和comAddress對(duì)象除了具有一般的屬性成員變量外,需要為hibernate提供一個(gè)parent屬性,如下所示
1
packge com;
2
3
import java.io.Serializabel;
4
5
public class HomeAddress implements Serializable{
6
private String street;
7
private String city;
8

9
private com.Customer customer;
10

11
public void setCustomer(Customer customer){
}
12
public Customer getCustomer(){
}

2

3

4

5

6

7

8


9

10


11


12


hibernate提供的這種組成關(guān)系映射允許嵌套使用
1
<component>
2
<compoent>
3

4
</componet>
5

6
</component>

2

3


4

5


6

2. 區(qū)分值value類型和實(shí)體Entity類型
Hibernate把持久化類的屬性分為value和Entity類型。前者沒(méi)有OID,不能被單獨(dú)持久化,不能單獨(dú)通過(guò)session加載,它的生命周期依賴于所屬的持久化類的對(duì)象生命周期,組件類型就是一種類型;而后者有OID,可以被單獨(dú)持久化。在通過(guò)Configuration類的addClass()方法加載映射文件時(shí),只需要加載與value類型對(duì)應(yīng)的實(shí)體類型,而不需要單獨(dú)加載組件類。當(dāng)通過(guò)hibernate進(jìn)行數(shù)據(jù)庫(kù)操作的時(shí)候,hibernate會(huì)自動(dòng)把組件類的屬性轉(zhuǎn)換為實(shí)體類的屬性,從而和table的列對(duì)應(yīng)起來(lái)