hibernate inverse

来源:互联网 发布:欧美护肤品推荐知乎 编辑:程序博客网 时间:2024/05/24 15:38

hibernate inverse

(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);

 

inverse=”true”时

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

  

  

  

 

原创粉丝点击