映射原理
一對多關聯映射和多對一關聯映射的映射原理是一致的,都是在多的一端加入一個外鍵,指向一的一端。關聯關系都是由多端維護,只是在寫映射時發生了變化。
多對一和一對多的區別
多對一和一對多的區別在于維護的關系不同:
(1)多對一:多端維護一端的關系,在加載多端時,可以將一端加載上來。
(2)一對多:一端維護多端的關系,在加載一端時,可以將多端加載上來。
分類
一對多單向關聯映射
對象模型
從對象模型中,我們可以看出,group持有user的一個引用。由于是單向關聯,所以數據在加載group時,會把user加載上來,但是user并不知道group的存在。
我們先看一下group和user的實體,以及映射文件。
group
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package com.bjpowernode.hibernate; import java.util.set; public class group { private int id; private string name; private set users; public int getid() { return id; } public void setid( int id) { this .id = id; } public string getname() { return name; } public void setname(string name) { this .name = name; } public set getusers() { return users; } public void setusers(set users) { this .users = users; } } |
user
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.bjpowernode.hibernate; public class user { private int id; private string name; public int getid() { return id; } public void setid( int id) { this .id = id; } public string getname() { return name; } public void setname(string name) { this .name = name; } } |
user.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
|
<?xml version= 1.0 "?> <!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping> < class name= "com.bjpowernode.hibernate.user" table= "t_user" > <id name= "id" > <generator class = "native" /> </id> <property name= "name" /> </ class > </hibernate-mapping> |
group.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?xml version= "1.0" ?> <!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping> < class name= "com.bjpowernode.hibernate.group" table= "t_group" > <id name= "id" > <generator class = "native" /> </id> <property name= "name" /> <!-- users屬性,表達的是本對象與user的一對多的關系 --> <set name= "users" > <!--當前表(group)的主鍵--> <key column= "groupid" /> <one-to-many class = "com.bjpowernode.hibernate.user" /> </set> </ class > </hibernate-mapping> |
生成的表結構和測試數據
缺點
1)因為多端user不知道group的存在(也就是user不維護與group的關系),所以在保存user時,關系字段groupid為null,如果該字段設置為非空,則將無法保存數據。
2)因為user不維護關系,而group維護關系,group就會發出多余的update語句,保證group和user有關系,這樣加載group時才把該users對應的用戶加載上來。
一對多雙向關聯映射
對象模型
雙向關聯映射對比單向關聯映射,對象的加載方向由單向變成了雙向。
我們看一下group和user的實體,映射文件
group
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package com.bjpowernode.hibernate; import java.util.set; public class group { private int id; private string name; private set users; public int getid() { return id; } public void setid( int id) { this .id = id; } public string getname() { return name; } public void setname(string name) { this .name = name; } public set getusers() { return users; } public void setusers(set users) { this .users = users; } } |
user
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package com.bjpowernode.hibernate; public class user { private int id; private string name; private group groups; public int getid() { return id; } public void setid( int id) { this .id = id; } public string getname() { return name; } public void setname(string name) { this .name = name; } public group getgroups() { return groups; } public void setgroups(group groups) { this .groups = groups; } } |
group.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?xml version= "1.0" ?> <!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package = "com.bjpowernode.hibernate" > < class name= "group" table= "t_group" > <id name= "id" > <generator class = "native" /> </id> <property name= "name" /> <!-- 影響控制反轉:inverse= "false" ,多的一端維護關系,讓一的一端失效 --> <set name= "users" inverse= "true" > <key column= "groupid" not- null = "true" /> <one-to-many class = "user" /> </set> </ class > </hibernate-mapping> |
user.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version= "1.0" ?> <!doctype hibernate-mapping public "-//hibernate/hibernate mapping dtd 3.0//en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package = "com.bjpowernode.hibernate" > < class name= "user" table= "t_user" > <id name= "id" > <generator class = "native" /> </id> <property name= "name" /> <!-- groups屬性,表達的是本對象與group的多對一的關系 --> <many-to-one name= "groups" class = "group" column= "groupid" /> </ class > </hibernate-mapping> |
生成的表和測試數據
一對多雙向關聯的映射方式:
1)在一的一端的集合上采用<key>標簽,在多的一端加入一個外鍵
2)在多的一端采用<many-to-one>標簽
注意:<key>標簽和<many-to-one>標簽加入的字段保持一直,否則會產生數據混亂。
inverse屬性:
inverse屬性可以用在一對多和多對多雙向關聯上,inverse屬性默認為false,為false表示本端維護關系,如果inverse為true,則本端不能維護關系,會交給另一端維護關系,本端失效。所以一對多關聯映射我們通常在多的一端維護關系,讓一的一端失效,所以設置為inverse為true。
注意:inverse屬性,只影響數據的存儲,也就是持久化。
目的
一對多雙向關聯映射的目的主要是為了解決一對多單向關聯的缺陷而不是需求驅動的。
總結
以上所述是小編給大家介紹的hibernate一對多關聯映射學習小結,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wvlu.html