認(rèn)識hibernate的幾種映射關(guān)系:
- 單向1-1(與單向N-1相似)
例子:一個人擁有一個身份證
有兩種策略實現(xiàn)1-1關(guān)聯(lián)映射
1)主鍵關(guān)聯(lián)(很少用,沒有擴展性):讓兩個對象擁有相同的主鍵汪茧,用來表明他們之間的一一對應(yīng)的關(guān)系椅亚。數(shù)據(jù)庫中不再有多余的字段維護(hù)他們之間的關(guān)系。僅僅通過表的主鍵來進(jìn)行關(guān)聯(lián)舱污。
2)唯一外鍵關(guān)聯(lián):外鍵關(guān)聯(lián)呀舔,可以用于N-1,在N方加入唯一性約束條件即可表示1-1關(guān)聯(lián)關(guān)系扩灯。
在N方加一個外鍵别威,指向1方。并且在N方指定unique為true驴剔。 - 單向1-N
例子:一個班級有多個學(xué)生
實現(xiàn):在N方加一個外鍵,指向1方粥庄。
它與單向N-1的區(qū)別在于:通過1可以加載N,而單向N-1是可以通過N加載1丧失。
在1方增加以下映射,通過set合集
<set name="students">
<key column="classesid"/>
<one-to-many class="com.hibernate.Student"/>
</set>
- 單向N-1
例子:多個用戶分在一個組里
實現(xiàn):在N方加一個外鍵,指向1方惜互。
在用戶(N方)加入以下映射
<many-to-one name="group" column="groupid"/>
- 單向N-N
實現(xiàn):可以通過一張關(guān)聯(lián)表實現(xiàn)映射布讹。兩張表分別加一個外鍵指向連接表 - 雙向1-1
使用外鍵關(guān)聯(lián)實現(xiàn)時琳拭,相對于單向1-1,需要在另一方增加標(biāo)簽
<one-to-one name="person" property-ref="idCard"/>
必須指定property-ref - 雙向1-N(雙向N-1是相同的)
在1方使用set合集描验。在N方增加一個外鍵白嘁,使用many-to-one標(biāo)簽。
在1方增加以下標(biāo)簽:
<set name="students">
<key column="classesid"/>
<one-to-many class="com.hibernate.Student"/>
</set>
在N方增加標(biāo)簽:
<many-to-one name="classes" column="classesid"/>
注意: inverse屬性可以用在一對多和多對多雙向關(guān)聯(lián)上膘流,inverse屬性默認(rèn)為false絮缅,為false表示本端可以維護(hù)關(guān)系,如果inverse為true呼股,則本端不能維護(hù)關(guān)系耕魄,會交給另一端維護(hù)關(guān)系,本端失效彭谁。所以一對多關(guān)聯(lián)映射我們通常在多的一端維護(hù)關(guān)系吸奴,讓一的一端失效。inverse是控制方向上的反轉(zhuǎn)缠局,只影響存儲
-
雙向N-N
雙向的目的就是為了兩端都能將對方加載上來则奥,和單向多對多的區(qū)別就是雙向需要在兩端都加入標(biāo)簽映射,需要注意的是:* 生成的中間表名稱必須一樣 * 生成的中間表中的字段必須一樣
實現(xiàn):
Role(角色)端關(guān)鍵映射代碼:
<set name="users" table="t_user_role">
<key column="role_id"/>
<many-to-many class="com.hibernate.User" column="user_id"/>
</set>
User(用戶)端關(guān)鍵映射代碼:
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com. hibernate.Role" column="role_id"/>
</set>