inverse
inverse控制反转(维护关联关系)
hibernate中控制反转inverse默认为false,维护关联关系
在双向一对多关联关系中,我们通常将one方设置inverse=”true”这样就有mang方维护关联关系,有利于系统优化
例如:班级(grade)和学生(student)关联关系中
<set name="students" table="student" inverse="true" >
<key column="gid"></key>
<one-to-many class="hibernatehand.entity.Student" />
</set>
<many-to-one name="grade" column="gid" class="hibernatehand.entity.Grade" />
Grade g=new Grade("JAVA一班", "JAVA软件开发一班");
Student s1=new Student("张1", "男");
Student s2=new Student("张2", "女");
//设置关联关系
s1.setGrade(g);
g.getStudents().add(s1);
g.getStudents().add(s2);
//保存
session.save(g);
session.save(s1);
session.save(s2);
数据库会插入一条班级信息和两条学生信息
Hibernate: select max(gid) from grade
Hibernate: select max(sid) from student
Hibernate: insert into cart.grade (gname, gdesc, gid) values (?, ?, ?)
Hibernate: insert into cart.student (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: insert into cart.student (sname, sex, gid, sid) values (?, ?, ?, ?)
当班级方inverse设置为true时候hibernate会多执行以下两条语句
Hibernate: update cart.student set gid=? where sid=?
Hibernate: update cart.student set gid=? where sid=?
//根据我们设置的关联关系局更新学生表中的所在班级信息
//完全多余
cascade
cascade级联操作当不为none时,hibernate会自动持久化所关联的对象
cascade属性可能值
all:对所有操作进行级联操作
save-update:执行保存和更新时候进行级联操作
delete:执行删除时进行级联操作
none:不执行级联操作(默认)
以上面例子为例我们在set中加入属性cascade=”all”
修改保存为只保存班级执行
//保存
session.save(g);
数据库同样插入一条班级信息和两条学生信息
Hibernate: select max(gid) from grade
Hibernate: select max(sid) from student
Hibernate: insert into cart.grade (gname, gdesc, gid) values (?, ?, ?)
Hibernate: insert into cart.student (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: insert into cart.student (sname, sex, gid, sid) values (?, ?, ?, ?)
因为设置的班级包含学生的关联关系;当我们保存班级时候,hibernate发现班级里有学生信息而数据库没有学生信息;就会把班级以及班级所包含的学生都插入到数据库;这就是级联操作
当我们执行删除操作时候也会把班级里的学生从学生表一并删除
Hibernate: delete from cart.student where sid=?
Hibernate: delete from cart.student where sid=?
Hibernate: delete from cart.grade where gid=?
在many-to-one中也加入cascade=”all”
当只删除学生s1时候:结果如下
Hibernate: delete from cart.student where sid=?
Hibernate: delete from cart.student where sid=?
Hibernate: delete from cart.grade where gid=?
hiernate删除了学生s1并删除了所在班级g,班级里的其他学生也一并删除(删除班级g学生s2就成了孤立节点,hibernate会删除这个孤立节点)