多對多表關係
關係型數據庫無法直接表達多對多的關係,需要引入中間表以外鍵關聯的方式來表達。如下圖:
多對多單向關聯映射
單向多對多關聯映射,是在其中一端加入一個屬性保存另一端的對象集合。而在另一端則不需要。看到這裏你可能會有疑問,這不是和一對多關聯一樣嗎?我們以在Categories一端作爲持有者來看。看到這個類圖確實是和一對多關聯裏的單向映射方式沒有區別。我們接着再看它的配置方式:
<class name="Category" table="t_category">
<id name="category_id">
<generator class="native"/>
</id>
<property name="category_name"/>
<set name="items" table="t_catetory_item">
<key column="item_id"/>
<many-to-many class="Item" column="item_id"/>
</set>
</class>
<class name="Item" table="t_item">
<id name="item_id">
<generator class="native"/>
</id>
<property name="item_basePrice"/>
</class>
從配置方式裏可以看見和一對多關係映射的區別在於:對應了中間表t_category_item。也就是說category持有的item不是直接持有,而是通過了中間的關係去對應持有的對象有什麼。而一對多關聯因爲其中一端來說是唯一的,則可以直接持有。
多對多雙向關聯
雙向關聯就是兩端都持有對方,看過了一對多的雙向和前面的單向多對多應該很容易理解了。這裏就不再多說,看看類圖和配置吧。<class name="Category" table="t_category">
<id name="category_id">
<generator class="native"/>
</id>
<property name="category_name"/>
<set name="items" table="t_catetory_item">
<key column="item_id"/>
<many-to-many class="Item" column="item_id"/>
</set>
</class>
<class name="Item" table="t_item">
<id name="item_id">
<generator class="native"/>
</id>
<property name="item_basePrice"/>
<set name="categories" table="t_catetory_item">
<key column="category_id"/>
<many-to-many class="Item" column="category_id"/>
</set>
</class>
繼承映射
繼承關係的映射呢看上去和之前的好像很不同,這裏爲了幫助理解需要說明一點。之前我們討論映射關係都是從關係型數據庫的角度出發,以類之間的關係去表達數據之間的關係。這在理解上沒有什麼問題,但是放在繼承映射裏就有問題了,因爲數據庫中並不存在繼承關係。所以,我們要換個角度了,以關係型數據庫來表達類的繼承關係。我們先看類圖:三種映射方式
- 使用 subclass 進行映射:將每一個實體對象映射到一個獨立的表中,也就是說不用在關係數據模型中考慮繼承關係和多態。
- 使用 joined-subclass 進行映射: 對於繼承關係中的子類使用同一個表,這就需要在數據庫表中增加額外的區分子類類型的字段。
- 使用 union-subclass 進行映射:每個類映射到一個表,通過關係數據模型中的外鍵來描述表之間的繼承關係。這也就相當於按照類的結構來建立數據庫中的表,並通過外鍵來建立表之間的繼承關係。
總結:映射關係的學習到了這裏就告一段落了,總結如下:
第一,關係映射的出發點應該是:如何在關係型數據庫中表達,類之間的關係。使關係型數據庫對象化。
第二,所有的映射關係的本質都是:在哪一個對象裏作爲屬性保存有另一個的對象或者對象集合
第三,對於數據的訪問的方向是:誰持有誰就是訪問入口