前言:
一、單向多對多
單向多對多的例子用人和職位來舉例,一個人可以有多個職位,一個職位會有多個人。單向多對多是指只能在一端來查詢獲取另一端的內容。多對多的關系在生成關系模型時會生成對象之前的關聯表,關聯表中存放著兩個關系表的主鍵,它們的關系如下所示:
代碼部分:
(1)映射和關系類
因為是單向的關系,所以只需要在一端進行維護,所以我們需要在User.hbm.xml配置文件中添加<many-to-many>標簽,并在標簽中加上對應的列關系,在<set>表中添加table屬性來指明生成新表,User.hbm.xml代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
< span style = "font-family:KaiTi_GB2312;font-size:18px;" >< hibernate-mapping > < class name = "com.bjpowernode.hibernate.User" table = "t_user" > < id name = "id" > < generator class = "native" /> </ id > < property name = "name" /> < set name = "roles" table = "t_user_role" > < key column = "user_id" /> < many-to-many class = "com.bjpowernode.hibernate.Role" column = "role_id" /> </ set > </ class > </ hibernate-mapping ></ span > |
Role.hbm.xml代碼比較簡單,不需要添加多余的標簽來維護關系:
1
2
3
4
5
6
7
8
|
< hibernate-mapping > < class name = "com.bjpowernode.hibernate.Role" table = "t_role" > < id name = "id" > < generator class = "native" /> </ id > < property name = "name" /> </ class > </ hibernate-mapping > |
因為user的映射中有set映射,所以需要在相應的類文件中添加Hashset,User.java代碼如下:
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
27
28
29
30
31
32
33
34
|
<span style= "font-family:KaiTi_GB2312;font-size:18px;" > import java.util.Set; public class User { private int id; private String name; private Set roles; 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 getRoles() { return roles; } public void setRoles(Set roles) { this .roles = roles; } }</span> |
Role.java代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class Role { 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; } } |
(2)添加和讀取數據:
進行添加數據時,需要首先吧關系保存到數據庫中,然后創建用戶Hash表,在hash表中添加對應的關系,最后創建用戶,將hash表添加到用戶上。這部分需注意的是寫入的先后順序,否則會出現很多null值,和之前的映射一樣的道理。
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
public void testSave1() { Session session = null ; try { session = HibernateUtils.getSession(); session.beginTransaction(); Role r1 = new Role(); r1.setName( "數據錄入人員" ); session.save(r1); Role r2 = new Role(); r2.setName( "商務主管" ); session.save(r2); Role r3 = new Role(); r3.setName( "商務經理" ); session.save(r3); Role r4 = new Role(); r4.setName( "項目會計" ); session.save(r4); User u1 = new User(); u1.setName( "張三" ); Set u1Roles = new HashSet(); u1Roles.add(r1); u1Roles.add(r2); u1.setRoles(u1Roles); session.save(u1); User u2 = new User(); u2.setName( "李四" ); Set u2Roles = new HashSet(); u2Roles.add(r1); u2Roles.add(r2); u2Roles.add(r3); u2.setRoles(u2Roles); session.save(u2); User u3 = new User(); u3.setName( "王五" ); Set u3Roles = new HashSet(); u3Roles.add(r3); u3Roles.add(r4); u3.setRoles(u3Roles); session.save(u3); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } } |
讀取時因為是單向關系,只需要通過一來讀取另一端的內容,通過user來讀取role的內容。代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public void testLoad1() { Session session = null ; try { session = HibernateUtils.getSession(); session.beginTransaction(); User user = (User)session.load(User. class , 2 ); System.out.println(user.getName()); for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) { Role role = (Role)iter.next(); System.out.println(role.getName()); } session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } } |
二、雙向多對多映射
和之前介紹的一樣,雙向多對多就是在兩端同時維護關系,從任何一端都能加載到另一端的內容,話不多說直接上代碼:
因為是雙向的所以需要同時加入雙向的集合映射,在配置文件中添加<set>標簽,添加多對多標簽,Role.hbm.xml代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
<hibernate-mapping> < class name= "com.bjpowernode.hibernate.Role" table= "t_role" > <id name= "id" > <generator class = "native" /> </id> <property name= "name" /> <set name= "users" table= "t_user_role" > <key column= "role_id" not- null = "true" /> <many-to-many class = "com.bjpowernode.hibernate.User" column= "user_id" /> </set> </ class > </hibernate-mapping> |
User.hbm.xml代碼如下,和單向映射代碼是一樣的:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
< span style = "font-family:KaiTi_GB2312;font-size:18px;" >< hibernate-mapping > < class name = "com.bjpowernode.hibernate.Role" table = "t_role" > < id name = "id" > < generator class = "native" /> </ id > < property name = "name" /> < set name = "users" table = "t_user_role" > < key column = "role_id" not-null = "true" /> < many-to-many class = "com.bjpowernode.hibernate.User" column = "user_id" /> </ set > </ class > </ hibernate-mapping > </ span > |
Role.java部分,和單向的user.java一樣需要添加集合映射set,代碼如下:
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
27
28
29
30
31
32
33
34
|
import java.util.Set; public class Role { 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.hbm.xml和User.java代碼和上文中的代碼相同,就不全部放上來了。
小結:
單向和多向通過幾篇博客的介紹相信大家已經明白,我們只需要記住單向的雙向的也就會了,挺簡單的。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/ww130929/article/details/54313397