上一篇博文已经讲解了一对多和多对一之间的关系了,一对多和多对一存在着关联关系(外键与主键的关系)。本博文主要讲解Inverse属性、cascade属性。这两个属性对关联关系都有影响数据库
Inverse属性:表示控制权是否转移..markdown
Inverse属性,是在维护关联关系的时候起做用的。只能在“一”的一方中使用该属性!Inverse属性的默认值为fasle,也就是当前一方是有控制权的session
从一下的几个方面看看Inverse在维护关联关系时是否起做用:app
将inverse属性设置为ture,使dept没有控制权测试
<!--维护关系的是Set集合,对应employee表--> <set cascade="save-update" name="set" table="employee" inverse="true">
执行保存数据操做时,发现Hibernate只执行了三条SQL语句。employee表的外键并无数据spa
结论:若是设置控制反转,即inverse=true, 而后经过部门方维护关联关系。在保存部门的时候,同时保存员工, 数据会保存,但关联关系不会维护。即外键字段为NULLcode
设置inverse属性为true,那么部门一方是没有控制权的。xml
<set cascade="save-update" name="set" table="employee" inverse="true">
咱们在查看数据的时候,发现inverse属性对查询数据是没有影响的对象
//查询出Dept对象 Dept de = (Dept) session.get(Dept.class, 1); System.out.println(dept.getDeptName()); System.out.println("-----------"); //用到的时候再查询数据库,Hibernate的懒加载【后面会讲解】 System.out.println(de.getSet());
部门和员工是存在外键的联系的,咱们接下来看看inverse属性对于解除关联关系有没有影响图片
//查找部门id为1的信息 Dept dept1 = (Dept) session.get(Dept.class, 1); //清除关联信息 dept1.getSet().clear();
能够解除关联关系,employee的外键字段被设置为NULL了
//查找部门id为2的信息 Dept dept1 = (Dept) session.get(Dept.class, 2); //清除关联信息 dept1.getSet().clear();
不能解除关联关系
//查找部门id为2的信息 Dept dept1 = (Dept) session.get(Dept.class, 2); //删除部门2 session.delete(dept1);
当有控制权的时候能够删除数据,先把外键设置为NULL,再删除数据!
//查找部门id为1的信息 Dept dept1 = (Dept) session.get(Dept.class, 1); //删除部门1 session.delete(dept1);
直接抛出异常,说该部门拥有外键,不能删除数据!
cascade表示级联的意思,简单来讲就是操做某一属性时,对其余关联字段的影响
casecade属性不像inverse属性只能在“一”的一方设置,它能够在“一”的一方也能够在“多”的一方设置
cascade有这么几个值
级联保存有什么用呢???咱们来看个例子:
//建立对象 Dept dept = new Dept(); dept.setDeptName("开发部"); Employee zs = new Employee(); zs.setEmpName("张珊"); zs.setSalary(1111); Employee ls = new Employee(); ls.setEmpName("李四"); ls.setSalary(2222); //维护关系 dept.getSet().add(zs); dept.getSet().add(ls); //保存dept对象 session.save(dept);
若是咱们在dept中设置了级联保存,那么Hibernate就会知道:保存dept的数据时,发现dept了外键,也把dept外键的对象保存在数据库之中
<set name="set" table="employee" cascade="save-update" >
级联删除,这个对于咱们来讲风险太大了,若是删除了某些数据,会把另外有关联的数据也删除…在实际中咱们通常不使用!
//删除部门为3的记录 Dept dept1 = (Dept) session.get(dept.getClass(), 3); session.delete(dept1);
它会先把3的外键对应的记录删除,再删除部门的数据
<set name="set" table="employee" cascade="save-update,delete" >
//删除部门为4的记录 Dept dept1 = (Dept) session.get(dept.getClass(), 4); session.delete(dept1);
咱们发现数据相关联的数据都没有了
上面咱们已经把cascade和inverse都介绍一遍了,那么cascade和inverse同时使用会怎么样呢???咱们来测试一下
<set name="set" table="employee" cascade="save-update,delete" inverse="true" >
//添加一个dept对象
session.save(dept);
若是咱们单单设置了inverse属性为true,那么数据库中确定是不能维护关联关系的【这里咱们已经测试了】
可是呢,如今也设置了级联保存,级联保存是可让该对象相关的关联关系一并保存在数据库中的。
咱们来看看结果:
从结果咱们能够看出:inverse和cascade是相互独立的。cascade是不能影响着inverse的!
上面的测试都是经过几个方面的,看起来有点多,所以咱们总结一下
inverse属性只能在“一”的一方中设置。inverse=false表示有控制权,inverse=ture表示没有控制权
多对多关系的时候也是同样的,只不过多对多的关联关系是在中间表中
cascade有这么几个值:
咱们可能使用到的每每是:save-update这个值,由于级联删除的风险太大了!
若是cascade和inverse同时设置时: