SSH-Hibernate(二)—映射關係(下)

    前面已經講了一對一和一對多關係使用Hibernate的映射。還剩下多對多關聯和繼承映射沒有講,這篇博客是想把這兩個一塊都總結了。

多對多表關係

    關係型數據庫無法直接表達多對多的關係,需要引入中間表以外鍵關聯的方式來表達。如下圖:


    多對多單向關聯映射

    單向多對多關聯映射,是在其中一端加入一個屬性保存另一端的對象集合。而在另一端則不需要。看到這裏你可能會有疑問,這不是和一對多關聯一樣嗎?我們以在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 進行映射:每個類映射到一個表,通過關係數據模型中的外鍵來描述表之間的繼承關係。這也就相當於按照類的結構來建立數據庫中的表,並通過外鍵來建立表之間的繼承關係。

    這裏就不寫如何配置了,太長了。
    總結:映射關係的學習到了這裏就告一段落了,總結如下:
          第一,關係映射的出發點應該是:如何在關係型數據庫中表達,類之間的關係。使關係型數據庫對象化。
          第二,所有的映射關係的本質都是:在哪一個對象裏作爲屬性保存有另一個的對象或者對象集合
          第三,對於數據的訪問的方向是:誰持有誰就是訪問入口
發佈了124 篇原創文章 · 獲贊 11 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章