(one)学生 < ------ > 课程(many)
学生:
public class Student
{
private String id;
private String name;
private Set<Course> courseSet; //one-to-manybidirection
------/getter()and setter()
}
课程:
public class Course
{
private String id;
private String name; //课程名字
private Student student;
------/getter()and setter()
}
学生:
<class name="beans.Student" table="students">
<id name="id"column="id" type="string">
<generator class="uuid"></generator>
</id>
<property name="name" column="name" type="string"></property>
<set name="courseSet"inverse="true" cascade="all">
<key column="fk_stu_id"></key>
<one-to-many class="beans.Course"/>
</set>
</class>
课程
<class name="beans.Course"table="courses" >
<id name="id"column="id" type="string">
<generator class="uuid"></generator>
</id>
<property name="name"column="name" type="string"></property>
<!--外键fk_stu_id 是调用student的.getId()取得的 course.getStudent().getId() -->
<many-to-one name="student"column="fk_stu_id" cascade="none">
</many-to-one>
</class>
测试代码:
Student student = new Student();
student.setName("zhangsan");
Course course1= new Course();
course1.setName("English");
course1.setStudent(student);
Course course2= new Course();
course2.setName("Math");
course2.setStudent(student);
Set<Course>set = new HashSet<Course>();
set.add(course1);
set.add(course2);
student.setCourseSet(set);
session.save(student);
Hibernate: insert into students (name, id) values (?, ?)
Hibernate: insert into courses (name, fk_stu_id, id)values (?, ?, ?)
Hibernate: insert into courses (name, fk_stu_id, id)values (?, ?, ?)
只发出3条insert语句
inverse=”false”时
Hibernate: insert into students (name, id) values (?, ?)
Hibernate: insert into courses (name, fk_stu_id, id)values (?, ?, ?)
Hibernate: insert into courses (name, fk_stu_id, id)values (?, ?, ?)
Hibernate: update courses set fk_stu_id=? where id=?
Hibernate: update courses set fk_stu_id=? where id=?
发出3条insert语句,和2条update语句
分析:
1:当inverse="true"时,表明由Course来维护一对多的关联关系(由Course来维护外键fk_stu_id的值),即fk_stu_id的值是由Course的student属性的OID决定的,
即fk_stu_id = Course.getStudent.getId()
所以当级联保存Course时,其外键fk_stu_id是调用Course.getStudent.getId()得到的
2:当inverse="false"时,表明由Student来维护一对多的关联关系(由Student来维护外键fk_stu_id的值),即fk_stu_id的值是由Student的OID决定的,
即fk_stu_id = Student.getId()
所以当级联保存Course时,执行完1+N个insert语句,这个过程和分析1的过程是一样的(即执行Course的insert时,其外键fk_stu_id也是调用Course.getStudent.getId()得到的),
然后还要发出N个update语句来更新Course对新的表里的fk_stu_id这个外键,其值由Student.getId()决定