(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()决定