hihernate一對(duì)多關(guān)聯(lián)映射(單向Classes----->Student)
一對(duì)多關(guān)聯(lián)映射利用了多對(duì)一關(guān)聯(lián)映射原理
多對(duì)一關(guān)聯(lián)映射:在多的一端加入一個(gè)外鍵指向一的一端,它維護(hù)的關(guān)系是多指向一
一對(duì)多關(guān)聯(lián)映射:在多的一端加入一個(gè)外鍵指向一的一端,它維護(hù)的關(guān)系是一指向多
也就是說(shuō)一對(duì)多和多對(duì)一的映射策略是一樣的,只是站的角度不同
在一一端維護(hù)關(guān)系的缺點(diǎn):
* 如果將t_student表里的classesid字段設(shè)置為非空,則無(wú)法保存
* 因?yàn)椴皇窃趕tudent這一端維護(hù)關(guān)系,所以student不知道是哪個(gè)班的,
所以需要發(fā)出多余的update語(yǔ)句來(lái)更新關(guān)系
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、測(cè)試方法:
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("計(jì)算機(jī)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、控制臺(tái)輸出sql語(yǔ)句
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語(yǔ)句是由于t_student表里面的classesid數(shù)據(jù)更新導(dǎo)致。
-------------------------------------------------------------------------------------------------
PS:本博客文章,如果沒(méi)有注明是有“轉(zhuǎn)”字樣,屬于本人原創(chuàng)。如果需要轉(zhuǎn)載,務(wù)必注明作者和文章的詳細(xì)出處地址,否則不允許轉(zhuǎn)載,多謝合作!