Hibernate的inverse和cascade属性
程序员文章站
2022-04-15 23:08:28
...
1、inverse:<set>节点的inverse属性指定关联关系的控制方向默认值为true,默认由one放来维护,
关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系,在<set>中设置inverse="false",
关联关系就由多方维护了,但是在一对多关联中,只能设置one放的inverse为true,这将有助于性能的改善,
只有在多对多情况下才会在<set>中设置哪一方为false。
**所有在Grade.hbm.xml(一方)的set标签设置inverse="true"**,关联关系由对方(多方)维护:
<set name="students" table="student" inverse="true">
<!--指定关联的外键-->
<key column="gid"></key>
<one-to-many class="com.lxj.entity.Student"></one-to-many>
</set>
2、cascade(级联操作):当设置了cascade属性部位none时,Hibernate会自动持久化所关联的对象
(cascade属性的设置会带来性能上的变动,谨慎设置),即当我保存班级的时候,发现学生不存在同时
保存学生而不需要单独在save一次学生。
all:对所有操作进行级联操作
save-update:执行保存和更新操作时候进行级联操作
delete:执行删除操作进行级联操作
none:对所有操作不进行级联操作。
2.1 没配置cascade:
Grade g = new Grade("java 1","1班");
Student student1 = new Student("女神",1);
Student student2 = new Student("男神",0);
g.getStudents().add(student1);
g.getStudents().add(student2);
student1.setGrade(g);
student2.setGrade(g);
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.save(g);
**//既然上面两个关联关系都配置了,报错班级就应该将学生自动保存,而不需要单独save学生
//所以想要支持这个就需要配置cascade属性**
**session.save(student1);
session.save(student2);**
transaction.commit();
HibernateUtil.closeSession();
2.2 配置cascade,在班级的<set>中配置:
//在保存和更新时候级联
<set name="students" table="student" inverse="true" cascade="save-update">
<!--指定关联的外键-->
<key column="gid"></key>
<one-to-many class="com.lxj.entity.Student"></one-to-many>
</set>
//测试代码
Grade g = new Grade("java 1","1班");
Student student1 = new Student("女神",1);
Student student2 = new Student("男神",0);
g.getStudents().add(student1);
g.getStudents().add(student2);
student1.setGrade(g);
student2.setGrade(g);
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.save(g);
**//这里就不需要在单独保存学生了**
transaction.commit();
HibernateUtil.closeSession();
2.3 同样的也可以保存学生的时候级联保存班级,就在学生的Student.hbm.xml中配置cascade:
<many-to-one name="grade" class="com.lxj.entity.Grade"
column="gid" cascade="all"></many-to-one>
//这时候设置学生与班级关联关系后,只需要保存学生也可保存班级了
3、设置了双向关联关系后的查询信息更简单:
Session session = HibernateUtil.getSession();
Student student = (Student) session.get(Student.class,1);
//因为设置了双向关联关系,直接get就可以获取到对应的班级,同样因为设置了双向关联关系,通过年级查学生get可以获取到学生集合
System.out.println(student.getGrade().getGname());
上一篇: SQL中的函数——floor()
下一篇: 今晚咱吃西餐