一, 關(guān)聯(lián)映射
1, 多對一映射
兩張表的關(guān)系是多對一的關(guān)系,這種配置是從多的一方配置,只修改多的一方的實體類和映射文件。配置完成之后,會自動和關(guān)聯(lián)類的主鍵進行連接查詢,所以無需指明關(guān)聯(lián)類對應(yīng)的連接屬性;
配置過程:
- 修改實體類:
1.1, 刪除實體類中作為外鍵的屬性,以及對應(yīng)的get和set方法;
1.2, 使用關(guān)聯(lián)類的聲明新的屬性,并增加對應(yīng)的get和set方法,實現(xiàn)關(guān)聯(lián)關(guān)系; - 修改映射文件:
2.1, 刪除外鍵屬性對應(yīng)的映射配置;
2.2, 為新的屬性,增加映射配置,因為這個屬性是對象屬性,所以不能用<property>元素進行映射,又因為是一個多對一的關(guān)聯(lián)關(guān)系,所以需要使用<many-to-one>元素,如下:
<many-to-one name="新增的屬性名" column="數(shù)據(jù)表的外鍵" class="關(guān)聯(lián)類的實現(xiàn)位置"/>
2, 一對多映射
兩張表是一對多的關(guān)系,這種配置是從一的一方進行配置,只需要修改一的一方的實體類和映射文件。配置的時候,指明了關(guān)聯(lián)表外鍵的屬性,自動和主鍵進行連接;
配置過程:
- 修改實體類:增加一個集合屬性,并增加它的get和set方法;該集合是用來存放多的一方的查詢出來的實例;
- 修改映射文件:為這個集合屬性增加映射配置,如下:
<set name="集合屬性的名稱" lazy="延遲加載的配置">
<key column="關(guān)聯(lián)表外鍵的的屬性"/>
<one-to-many class="關(guān)聯(lián)類的實現(xiàn)位置">
</set>
3, 多對多映射
兩張表是多對多的關(guān)系,這種配置需要創(chuàng)建一個中間表作為輔助,這個中間表的屬性對應(yīng)兩張表的主鍵,并分別作為外鍵和兩張表關(guān)聯(lián),這樣兩張表都和這種中間表形成了一對多的關(guān)系;我們借助中間表進行兩次類似一對多的配置即可;
配置過程:
- 配置表Table01:
1.1, 修改表1的實體類:增加集合屬性,并增加對應(yīng)的get和set屬性,用來存放表2的實例;
1.2, 修改表1的映射文件:為這個集合屬性,增加映射配置,這里也借助中間表Table12,如下:
<set
name="表1的集合屬性"
table="中間表Table12"
inverse="主管方配置"
cascade="級聯(lián)操作級別(增刪改的權(quán)限)">
<key column="在中間表中參照表1主鍵的外鍵名稱"/>
<many-to-many column="在中間表中參照表2主鍵的外鍵名稱" class="表2的實現(xiàn)類"/>
</set>
- 配置表Table02:
2.1, 修改表2的實體類:增加集合屬性,并增加對應(yīng)的get和set屬性,用來存放表1的實例;
2.2, 修改表2的映射文件:為這個集合屬性,增加映射配置,這里也借助中間表Table12,如下:
<set name="表2的集合屬性" table="中間表Table12">
<key column="在中間表中參照表2主鍵的外鍵名稱"/>
<many-to-many column="在中間表中參照表1主鍵的外鍵名稱" class="表1的實現(xiàn)類"/>
</set>