例子:
具體映射方式:
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
</set>
1、User的POJO類
1
import java.util.Set;
2
3
public class User {
4
5
private int id;
6
7
private String name;
8
9
private Set roles;
10
//省略setter、getter方法
11
}
2、Role的POJO類
2

3

4

5

6

7

8

9

10

11

1
public class Role {
2
3
private int id;
4
5
private String name;
6
//省略setter、getter方法
7
}

2

3

4

5

6

7

3、User的映射文件User.hbm.xml
1
<?xml version="1.0"?>
2
<!DOCTYPE hibernate-mapping PUBLIC
3
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
5
<hibernate-mapping>
6
<class name="org.apple.hibernate.User" table="t_user">
7
<id name="id">
8
<generator class="native"/>
9
</id>
10
<property name="name"/>
11
<set name="roles" table="t_user_role">
12
<key column="userid"/>
13
<many-to-many column="roleid" class="org.apple.hibernate.Role"/>
14
</set>
15
</class>
16
</hibernate-mapping>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

4、Role的映射文件Role.hbm.xml
1
<?xml version="1.0"?>
2
<!DOCTYPE hibernate-mapping PUBLIC
3
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
5
<hibernate-mapping>
6
<class name="org.apple.hibernate.Role" table="t_role" >
7
<id name="id">
8
<generator class="native"/>
9
</id>
10
<property name="name"/>
11
</class>
12
</hibernate-mapping>
5、測試保存數據方法:
2

3

4

5

6

7

8

9

10

11

12

1
public void testSave()
2
{
3
Session session = null;
4
try {
5
session = HibernateUtil.getSession();
6
session.beginTransaction();
7
Role role1 = new Role();
8
role1.setName("CEO");
9
session.save(role1);
10
Role role2 = new Role();
11
role2.setName("總經理");
12
session.save(role2);
13
Role role3= new Role();
14
role3.setName("項目經理");
15
session.save(role3);
16
User user1 = new User();
17
user1.setName("張三");
18
Set user1role = new HashSet();
19
user1role.add(role1);
20
user1role.add(role2);
21
user1role.add(role3);
22
user1.setRoles(user1role);
23
24
User user2 = new User();
25
user2.setName("李四");
26
Set user2role = new HashSet();
27
user2role.add(role1);
28
user2role.add(role2);
29
user2.setRoles(user2role);
30
session.save(user1);
31
session.save(user2);
32
session.beginTransaction().commit();
33
34
35
} catch (Exception e) {
36
e.printStackTrace();
37
session.beginTransaction().rollback();
38
39
}finally{
40
session.close();
41
}
42
}
PS:由于t_user_role中的字段都是參照t_user中的id和t_role的id,因此不用調用session.save(role)方法。
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

數據庫表數據:
mysql> select *from t_user_role;
+--------+--------+
| userid | roleid |
+--------+--------+
| 1 | 1 |
| 2 | 1 |
| 1 | 2 |
| 2 | 2 |
| 1 | 3 |
mysql> select *from t_user;
+----+------+
| id | name |
+----+------+
| 1 | 張三 |
| 2 | 李四 |
+----+------+
mysql> select *from t_role;
+----+----------+
| id | name |
+----+----------+
| 1 | CEO |
| 2 | 總經理 |
| 3 | 項目經理 |
+----+----------+
6、測試查詢方法:
1
public void testLoad1()
2
{
3
Session session = null;
4
try {
5
session = HibernateUtil.getSession();
6
session.beginTransaction();
7
8
session.beginTransaction().commit();
9
User user = (User)session.load(User.class, 1);
10
System.out.println("user.name="+user.getName());
11
for(Iterator it = user.getRoles().iterator();it.hasNext();)
12
{
13
Role role = (Role)it.next();
14
System.out.println("role.name="+role.getName());
15
}
16
17
18
} catch (Exception e) {
19
e.printStackTrace();
20
session.beginTransaction().rollback();
21
22
}finally{
23
session.close();
24
}
25
}
26
查詢結果:
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

Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_ from t_user user0_ where user0_.id=?
user.name=張三
Hibernate: select roles0_.userid as userid1_, roles0_.roleid as roleid1_, role1_.id as id2_0_, role1_.name as name2_0_ from t_user_role roles0_ left outer join t_role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
role.name=總經理
role.name=項目經理
role.name=CEO
PS:由于一個人可能有多個角色,要把一個人對應的角色迭代出來。
-------------------------------------------------------------------------------------------------
PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者和文章的詳細出處地址,否則不允許轉載,多謝合作!