【Hibernate步步为营】--多对多映射详解
一、單向多對(duì)多
? ? ? ? 仍然按照前幾篇的文章格式來(lái)討論,首先來(lái)看對(duì)象之間的關(guān)系,單向的多對(duì)多關(guān)系是兩個(gè)對(duì)象之間發(fā)生的,比如在人和職位之間,一個(gè)人可以有多個(gè)職位,而且一個(gè)職位也可以由多人來(lái)負(fù)責(zé),所以它們之間就形成了多對(duì)多的關(guān)系,另外這種單向性是指只能在一端來(lái)查詢獲取另一端的內(nèi)容。另外因?yàn)槭嵌鄬?duì)多之間的關(guān)系,所以在生成關(guān)系模型時(shí)會(huì)生成對(duì)象之間的關(guān)聯(lián)表,實(shí)際它們之間的關(guān)系的是關(guān)聯(lián)表,具體的對(duì)象模型如下:
? ? ? ?上面已經(jīng)說(shuō)過(guò)多對(duì)多的關(guān)系會(huì)生成一個(gè)關(guān)聯(lián)表,在關(guān)聯(lián)表中來(lái)維護(hù)之間的關(guān)系,所以對(duì)應(yīng)的關(guān)系模型中會(huì)有一個(gè)關(guān)系表,這個(gè)關(guān)系表中存放著兩個(gè)關(guān)系表的主鍵,并且關(guān)系表的主鍵是另外兩張表的主鍵的組合,如下圖:
? ?1.1、映射
? ? ? ? 上面的關(guān)系模型中會(huì)生成一個(gè)關(guān)系表,所以在映射中要編寫(xiě)對(duì)應(yīng)的屬性,因?yàn)槭菃蜗虻年P(guān)聯(lián)關(guān)系所以主要的映射關(guān)系是在映射的原方向添加的,對(duì)應(yīng)的上面的關(guān)系模型上就是在T_user中添加多對(duì)多映射的關(guān)系。
? ? 1.1.1 User.hbm.xml
? ? ? ? 文件中要使用<many-to-many>標(biāo)簽,并且在標(biāo)簽中添加上對(duì)應(yīng)的列關(guān)系,因?yàn)槟阋寖蓚€(gè)對(duì)象中都要清楚它們之間的映射是如何使用的,并且在生成的關(guān)系表中哪一列是對(duì)應(yīng)的自己的外鍵,所以要在該標(biāo)簽中指明,另外在<set>標(biāo)簽中添加table屬性會(huì)指明要生成新表,下面的示例中添加了t_user_role,所以會(huì)生成新的關(guān)聯(lián)表。
[html] view plain copy? ? 1.1.2 Role.hbm.xml
? ? ? ?因?yàn)槭菃蜗虻年P(guān)系,所以在該映射文件中就不需要添加多余的標(biāo)簽來(lái)維護(hù)關(guān)系了,它的內(nèi)部代碼也會(huì)很簡(jiǎn)單,對(duì)應(yīng)的映射代碼如下:
[html] view plain copy
? 1.2、類文件
? ? ? 類文件中代碼的編寫(xiě)要和映射文件中配置的相同,它們之間是相互對(duì)應(yīng)的,在user中因?yàn)槭褂昧?lt;set>映射,所以在相應(yīng)的類文件中也要添加Haseset來(lái)標(biāo)明之間的映射關(guān)系。
? ? 1.2.1 User.java
? ? ?類代碼沒(méi)有什么好討論的了,里面的內(nèi)容和前幾篇文章的大致相同,除了基本的屬性和方法外還需要添加對(duì)應(yīng)的HashSet。
? ? 1.2.2 Role.java
? ? ?基本的屬性和方法,它的頁(yè)面代碼是非常簡(jiǎn)單基礎(chǔ)的,不需要添加任何復(fù)雜的內(nèi)容。[java] view plain copy
? ? ?生成的表結(jié)構(gòu)如下:
? 1.3、操作
? ? ?1.3.1 插入操作
? ? ? 演示插入操作,新創(chuàng)建表后向表中寫(xiě)入數(shù)據(jù),對(duì)應(yīng)著關(guān)系模型,在關(guān)系模型中最復(fù)雜的是關(guān)聯(lián)表部分,需要添加多個(gè)對(duì)應(yīng)角色,并把角色分配到對(duì)應(yīng)的表中,所以首先要?jiǎng)?chuàng)建關(guān)系并把關(guān)系保存到數(shù)據(jù)庫(kù)中,然后創(chuàng)建用戶Hash表,在Hash表中添加對(duì)應(yīng)的關(guān)系,最后創(chuàng)建用戶,然后將Hash表添加到用戶上,代碼如下: [java] view plain copy
? ? ?1.3.2 讀取操作
? ? ? 讀取操作相對(duì)于寫(xiě)入來(lái)說(shuō)就很簡(jiǎn)單了,因?yàn)槭菃蜗虻年P(guān)系,所以在讀取時(shí)只能通過(guò)一端來(lái)讀取另一端的內(nèi)容,也就是說(shuō)通過(guò)User對(duì)象來(lái)讀取Role的內(nèi)容,如下代碼:
[java] view plain copy二、雙向多對(duì)多
? ? ? ? 雙向的多對(duì)多映射可以看做是單向的一種擴(kuò)展,它其實(shí)是為了設(shè)置在兩端同時(shí)維護(hù)關(guān)系,從任何一端都能夠加載到另一端的內(nèi)容,在實(shí)現(xiàn)上和單向的起始端是相同的都要使用<many-to-many>標(biāo)簽。
? ? ? ? 同樣以上面的User和Role來(lái)做示例,上面的示例中使用了單向的多對(duì)多,不同的是這里要使用雙向關(guān)系,所以要在Role的一端添加同樣的映射關(guān)系,并在相應(yīng)的對(duì)象中添加集合映射,其中對(duì)應(yīng)的User內(nèi)的代碼不會(huì)發(fā)生改變。
? ?2.1 Role.hbm.xml
? ? ? ?因?yàn)槭请p向的多對(duì)多所以要在對(duì)象的兩端同時(shí)加入雙向的集合映射,也就是在配置文件中添加<set>標(biāo)簽,并在標(biāo)簽中添加<many-to-many>標(biāo)簽,具體的配置方法類似于上文的User.hbm.xml的配置方法,如下:
[html] view plain copy??2.2 Role.java
? ? 同單向的多對(duì)多關(guān)系中的文件相同,不過(guò)需要在對(duì)象中添加集合映射Set,使用set來(lái)標(biāo)明映射的集合,如下代碼:
[java] view plain copy? ? ? ?雙向關(guān)聯(lián)映射是在單向的關(guān)聯(lián)映射基礎(chǔ)上配置而來(lái)的,只需要在映射文件的兩端同時(shí)配置<many-to-many>即可,也就是說(shuō)User.hbm.xml和User.java代碼和上文中的代碼相同,不發(fā)生變化,所以不再重復(fù)添加了。
結(jié)語(yǔ)
總結(jié)
以上是生活随笔為你收集整理的【Hibernate步步为营】--多对多映射详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Hibernate步步为营】--(一对
- 下一篇: 【Hibernate步步为营】--关联映