認(rèn)識(shí)hibernate的幾種映射關(guān)系:
- 單向1-1(與單向N-1相似)
例子:一個(gè)人擁有一個(gè)身份證
有兩種策略實(shí)現(xiàn)1-1關(guān)聯(lián)映射
1)主鍵關(guān)聯(lián)(很少用,沒有擴(kuò)展性):讓兩個(gè)對(duì)象擁有相同的主鍵,用來表明他們之間的一一對(duì)應(yīng)的關(guān)系。數(shù)據(jù)庫(kù)中不再有多余的字段維護(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方加一個(gè)外鍵,指向1方。并且在N方指定unique為true。 - 單向1-N
例子:一個(gè)班級(jí)有多個(gè)學(xué)生
實(shí)現(xiàn):在N方加一個(gè)外鍵,指向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
例子:多個(gè)用戶分在一個(gè)組里
實(shí)現(xiàn):在N方加一個(gè)外鍵,指向1方。
在用戶(N方)加入以下映射
<many-to-one name="group" column="groupid"/>
- 單向N-N
實(shí)現(xiàn):可以通過一張關(guān)聯(lián)表實(shí)現(xiàn)映射。兩張表分別加一個(gè)外鍵指向連接表 - 雙向1-1
使用外鍵關(guān)聯(lián)實(shí)現(xiàn)時(shí),相對(duì)于單向1-1,需要在另一方增加標(biāo)簽
<one-to-one name="person" property-ref="idCard"/>
必須指定property-ref - 雙向1-N(雙向N-1是相同的)
在1方使用set合集。在N方增加一個(gè)外鍵,使用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屬性可以用在一對(duì)多和多對(duì)多雙向關(guān)聯(lián)上,inverse屬性默認(rèn)為false,為false表示本端可以維護(hù)關(guān)系,如果inverse為true,則本端不能維護(hù)關(guān)系,會(huì)交給另一端維護(hù)關(guān)系,本端失效。所以一對(duì)多關(guān)聯(lián)映射我們通常在多的一端維護(hù)關(guān)系,讓一的一端失效。inverse是控制方向上的反轉(zhuǎn),只影響存儲(chǔ)
-
雙向N-N
雙向的目的就是為了兩端都能將對(duì)方加載上來,和單向多對(duì)多的區(qū)別就是雙向需要在兩端都加入標(biāo)簽映射,需要注意的是:* 生成的中間表名稱必須一樣 * 生成的中間表中的字段必須一樣
實(shí)現(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>