最近學習比較繁忙,老毛病又開始找上頭了,但是寫博客似乎成爲了生活中不可缺少的一部分,起初只是爲了能夠督促自己能夠踏實學習,但是現在已經不是簡單的學習總結了,通過播客,認識了很多和我有共同愛好的朋友們,每天去將我的學習情況以及一些技術和他們交流已經成爲我生活的一部分了。再次,感謝這個平臺,感謝那些一直支持我的朋友們,在接下來的時間,我將更加努力完善播客內容。在接下來的幾天,將和大家一起分享Hibernate相關知識。
一、集合映射
在持久化類中,有時會使用到值類型的對象屬性,那麼我們需要對值類型集合屬性進行映射,需要用到集合映射。Hibernate支持的集合接口有set,list,map等,相對應在對象映射文件中,class元素有對應的<set>,<list>,<map>等,此外還可以用<bag>,<idbag>,<primitive-array>和<array>元素。
1.映射set
eg:我們有一個學生持久化類,他對應很多的個人愛好,那麼我們可以將個人愛好作爲一個值類型的集合放到實體類員工中,那麼在映射文件中按如下設置:
<set name=“hobbies”table="student_hobby">
<key column=“STUDENT_ID” />
<element type="string" column="hobby_name" not_null="true"/>
</set>
其中name屬性是指要映射的屬性名,table屬性是指定對應的數據庫表名,key子元素指定集合屬性對應表的外鍵列,element子元素映射集合內的元素
其他的的設置方式都差不多,這裏就不一一列出了。只是要根據我們實際的業務要求,選擇不同的集合,bag主要允許重複元素和無序,list是可重複有序,map強調鍵值對
二、組件映射
Hibernate建議在進行領域模型建模的時候要細粒度一些,也就是類要比表多,這就是組件映射方式。
eg:一個客戶有家庭地址和公司地址,在表中相應都對應省市政及街道4個字段,共八個字段,再加上其他字段,這樣設計粒度太粗,那麼我們可以將這個地址抽象出一個值類型的地址類,然後再客戶類中實例化兩個地址類即可。映射文件設置如下:
<component name="homeAddress" class="Address">
<property name="province" column ="home_province" />
<property name="city" column ="home_city" />
<property name="detail" column ="home_detail" />
<property name="street" column ="home_street" />
</component>
同樣設置公司地址就可以了。注意,當集合中的元素是組件類的時候,我們用composite-element元素來設置。
三、關聯關係映射
不同持久化類之間的一種結構關係
1.單向多對一(多個員工屬於同一部門)
需要設置<many-to-one>元素。
2.單向一對多(同一部門有多個員工)
需要在set元素中設置<one-to-many>元素
3.一對一(一個人只有一張身份證)
方式一:基於唯一外鍵
方式一樣是設置<many-to-one>元素,不同需要設置屬性unique爲true,級聯屬性cascade爲all。
方式二:基於主鍵
這時我們需要在映射文件兩處修改,一個是主鍵生成策略應該改爲foreign,然後增加子元素param子元素指定是用property屬性指定的那個屬性,然後增加<one-to-one>,屬性constraints設置爲true
4.多對多
設置many-to-many元素。