hibernate inverse

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值