hihernate一對多關聯映射(單向Classes----->Student)
一對多關聯映射利用了多對一關聯映射原理
多對一關聯映射:在多的一端加入一個外鍵指向一的一端,它維護的關系是多指向一
一對多關聯映射:在多的一端加入一個外鍵指向一的一端,它維護的關系是一指向多
也就是說一對多和多對一的映射策略是一樣的,只是站的角度不同
在一一端維護關系的缺點:
* 如果將t_student表里的classesid字段設置為非空,則無法保存
* 因為不是在student這一端維護關系,所以student不知道是哪個班的,
所以需要發出多余的update語句來更新關系
1、Classes的POJO類
1
public class Classes {
2
private int id;
3
private String name;
4
private Set students;
5
//省略setter、getter方法
6
}
2、Student的POJO類
2

3

4

5

6

1
public class Student {
2
private int id;
3
private String name;
4
//省略setter、getter方法
5
}
3、Classes中的映射文件Classes.hbm.xml
2

3

4

5

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 package="org.apple.hibernate">
6
<class name="Classes" table="t_classes" >
7
<id name="id">
8
<generator class="native"/>
9
</id>
10
<property name="name"/>
11
<set name="students">
12
<key column="classesid"/>
13
<one-to-many class="Student"/>
14
</set>
15
</class>
16
</hibernate-mapping>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

4、Student中的映射文件Student.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.Student" table="t_student">
7
<id name="id">
8
<generator class="native"/>
9
</id>
10
<property name="name"/>
11
</class>
12
</hibernate-mapping>

2

3

4

5

6

7

8

9

10

11

12

5、測試方法:
1
import java.util.HashSet;
2
import java.util.Set;
3
import junit.framework.TestCase;
4
import org.hibernate.Session;
5
6
public class One2Many1 extends TestCase {
7
public void testSave(){
8
Session session = null;
9
try {
10
session = HibernateUtil.getSession();
11
session.beginTransaction();
12
Student student = new Student();
13
student.setName("張三");
14
Student student1= new Student();
15
student1.setName("李四");
16
session.save(student);
17
session.save(student1);
18
Set students = new HashSet();
19
students.add(student);
20
students.add(student1);
21
Classes classes = new Classes();
22
classes.setName("計算機04-3");
23
classes.setStudents(students);
24
session.save(classes);
25
session.beginTransaction().commit();
26
27
} catch (Exception e) {
28
e.printStackTrace();
29
session.beginTransaction().rollback();
30
}finally
31
{
32
session.close();
33
}
34
}
35
36
}
37

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

6、控制臺輸出sql語句
Hibernate: insert into t_student (name) values (?)
Hibernate: insert into t_student (name) values (?)
Hibernate: insert into t_classes (name) values (?)
Hibernate: update t_student set classesid=? where id=?
Hibernate: update t_student set classesid=? where id=?
PS:后面兩條update語句是由于t_student表里面的classesid數據更新導致。
-------------------------------------------------------------------------------------------------
PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者和文章的詳細出處地址,否則不允許轉載,多謝合作!