1. 学生表student 和年级表 grade

2. 类Student 和Grade类

  • Student
1
2
3
4
5
6
7
public class Student {
private int id;
private String name;
private int age;
private Grade grade;
//get…set
}
  • Grande
1
2
3
4
5
6
public class Grade {
private int id;
private String name;
private Set<Student> students = new HashSet<Student>(0);
//get…set
}

3. 映射文件

  • Grade.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<hibernate-mapping package="cn.siggy.pojo">
<class name="Grade">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<!-- set是 Grade中的集合属性 name属性名称 -->
<set name="students">
<!-- key表示外键 column外键列名-->
<key column="grade_id"></key>
<!-- one-to-many 一对多 类Grade 中 students 所表示类型 -->
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
  • Student.hbm.xml
1
2
3
4
5
6
7
8
9
10
<hibernate-mapping package="cn.siggy.pojo">
<class name="Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<property name="age"/>
<many-to-one name="grade" class="Grade" column="grade_id" not-null="true"></many-to-one>
</class>
</hibernate-mapping>

4. 测试代码

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
56
57
58
59
60
61
62
63
64
65
66
67
@Test
public void testSave() throws HibernateException, SerialException, SQLException{
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Grade grade = new Grade();
grade.setName("基础");

Student stu = new Student();
stu.setName("张三疯");
stu.setAge(22);
stu.setGrade(grade);
Student stu1 = new Student();
stu1.setName("老王");
stu1.setAge(23);
stu1.setGrade(grade);
//关联
//保存数据的顺序 是根据外键的配置来决定的
//如果外键不能为null,那么先保存一的一端
//如果外键可以为null,则可以随意保存
session.save(grade);
session.save(stu);
session.save(stu1);

tx.commit();

}catch (HibernateException e) {
if(tx!=null)
tx.rollback();
e.printStackTrace();
throw e;
}finally{
HibernateUtil.closeSession();
}
}
@Test
public void testGet(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
//取数据
Grade grade = (Grade)session.get(Grade.class, 2);
System.out.println("gradeName="+grade.getName());
System.out.println("grade所对应的多的一端的数据");
Iterator<Student> iter = grade.getStudents().iterator();
for(;iter.hasNext();){
Student temp = iter.next();
System.out.println("name="+temp.getName()+"\tage="+temp.getAge());
}
System.out.println("========================");
Student stu = (Student)session.get(Student.class, 1);
System.out.println("studentname="+stu.getName()+"gradeName="+
stu.getGrade().getName());
tx.commit();
}catch (HibernateException e) {
if(tx!=null)
tx.rollback();
e.printStackTrace();
throw e;
}finally{
HibernateUtil.closeSession();
}
}

总结:

  在双向的一对多关联映射中,注意一的一端的配置:<key>中不用指定非空not-null;如果想要一的一端来维护关系,那么在多的一端不用指定关联列非空。