SSH-Hibernate(二)―映射關系(下)
來源:程序員人生 發布時間:2015-01-16 08:24:00 閱讀次數:3818次
前面已講了1對1和1對多關系使用Hibernate的映照。還剩下多對多關聯和繼承映照沒有講,這篇博客是想把這兩個1塊都總結了。
多對多表關系
關系型數據庫沒法直接表達多對多的關系,需要引入中間表之外鍵關聯的方式來表達。以下圖:

多對多單向關聯映照
單向多對多關聯映照,是在其中1端加入1個屬性保存另外一真個對象集合。而在另外一端則不需要。看到這里你可能會有疑問,這不是和1對多關聯1樣嗎?我們以在Categories1端作為持有者來看。
看到這個類圖確切是和1對多關聯里的單向映照方式沒有區分。我們接著再看它的配置方式:
<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>
從配置方式里可以看見和1對多關系映照的區分在于:對應了中間表t_category_item。也就是說category持有的item不是直接持有,而是通過了中間的關系去對應持有的對象有甚么。而1對多關聯由于其中1端來講是唯1的,則可以直接持有。
多對多雙向關聯
雙向關聯就是兩端都持有對方,看過了1對多的雙向和前面的單向多對多應當很容易理解了。這里就不再多說,看看類圖和配置吧。
<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>
繼承映照
繼承關系的映照呢看上去和之前的好像很不同,這里為了幫助理解需要說明1點。之前我們討論映照關系都是從關系型數據庫的角度動身,以類之間的關系去表達數據之間的關系。這在理解上沒有甚么問題,但是放在繼承映照里就有問題了,由于數據庫中其實不存在繼承關系。所以,我們要換個角度了,以關系型數據庫來表達類的繼承關系。我們先看類圖:
3種映照方式
- 使用 subclass 進行映照:將每個實體對象映照到1個獨立的表中,也就是說不用在關系數據模型中斟酌繼承關系和多態。
- 使用 joined-subclass 進行映照: 對繼承關系中的子類使用同1個表,這就需要在數據庫表中增加額外的辨別子類類型的字段。
- 使用 union-subclass 進行映照:每一個類映照到1個表,通過關系數據模型中的外鍵來描寫表之間的繼承關系。這也就相當于依照類的結構來建立數據庫中的表,并通過外鍵來建立表之間的繼承關系。
這里就不寫如何配置了,太長了。
總結:映照關系的學習到了這里就告1段落了,總結以下:
第1,關系映照的動身點應當是:如何在關系型數據庫中表達,類之間的關系。使關系型數據庫對象化。
第2,所有的映照關系的本質都是:在哪個對象里作為屬性保存有另外一個的對象或對象集合
第3,對數據的訪問的方向是:誰持有誰就是訪問入口
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈