现在的位置: 首页 > 综合 > 正文

hibernate inverse

2013年08月04日 ⁄ 综合 ⁄ 共 2286字 ⁄ 字号 评论关闭

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

  

  

  

 

抱歉!评论已关闭.