pdf做电子书下载网站,优秀html5网站,银川网站设计建设,有哪些网站程序前言上一篇博文已经讲解了一对多和多对一之间的关系了#xff0c;一对多和多对一存在着关联关系(外键与主键的关系)。本博文主要讲解Inverse属性、cascade属性。这两个属性对关联关系都有影响Inverse属性Inverse属性#xff1a;表示控制权是否转移..true:控制权已转移【当前一…前言上一篇博文已经讲解了一对多和多对一之间的关系了一对多和多对一存在着关联关系(外键与主键的关系)。本博文主要讲解Inverse属性、cascade属性。这两个属性对关联关系都有影响Inverse属性Inverse属性表示控制权是否转移..true:控制权已转移【当前一方没有控制权】false控制权没有转移【当前一方有控制权】Inverse属性是在维护关联关系的时候起作用的。只能在“一”的一方中使用该属性Inverse属性的默认值为fasle也就是当前一方是有控制权的从一下的几个方面看看Inverse在维护关联关系时是否起作用保存数据获取数据解除关联关系删除数据对关联关系的影响保存数据将inverse属性设置为ture使dept没有控制权执行保存数据操作时发现Hibernate只执行了三条SQL语句。employee表的外键并没有数据结论如果设置控制反转,即inversetrue, 然后通过部门方维护关联关系。在保存部门的时候同时保存员工 数据会保存但关联关系不会维护。即外键字段为NULL查询数据设置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属性对于解除关联关系有没有影响当部门一方有权限时即inverse属性为false//查找部门id为1的信息Dept dept1 (Dept) session.get(Dept.class, 1);//清除关联信息dept1.getSet().clear();可以解除关联关系employee的外键字段被设置为NULL了当部门一方没有权限时即inverse属性为true//查找部门id为2的信息Dept dept1 (Dept) session.get(Dept.class, 2);//清除关联信息dept1.getSet().clear();不能解除关联关系删除数据对关联关系的影响当部门一方有权限时即inverse属性为false//查找部门id为2的信息Dept dept1 (Dept) session.get(Dept.class, 2);//删除部门2session.delete(dept1);当有控制权的时候可以删除数据先把外键设置为NULL再删除数据当部门一方没有权限时即inverse属性为true//查找部门id为1的信息Dept dept1 (Dept) session.get(Dept.class, 1);//删除部门1session.delete(dept1);直接抛出异常说该部门拥有外键不能删除数据cascade属性cascade表示级联的意思简单来说就是操作某一属性时对其他关联字段的影响casecade属性不像inverse属性只能在“一”的一方设置它可以在“一”的一方也可以在“多”的一方设置cascade有这么几个值none 不级联操作 默认值save-update 级联保存或更新delete 级联删除save-update,delete 级联保存、更新、删除all 同上。级联保存、更新、删除级联保存级联保存有什么用呢我们来看个例子如果在保存对象的时候没有把相关的对象也一并保存进数据库会出现错误。因为它会发现dept是有外键的而外键又是一个对象来保存着这个对象在数据库表中并没有存在因此会抛出异常//创建对象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外键的对象保存在数据库之中级联删除级联删除这个对于我们来说风险太大了如果删除了某些数据会把另外有关联的数据也删除...在实际中我们一般不使用在没有设置级联删除的时候我们试试删除dept//删除部门为3的记录Dept dept1 (Dept) session.get(dept.getClass(), 3);session.delete(dept1);它会先把3的外键对应的记录删除再删除部门的数据在设置级联删除的时候我们试试删除dept级联删除数据//删除部门为4的记录Dept dept1 (Dept) session.get(dept.getClass(), 4);session.delete(dept1);我们发现数据相关联的数据都没有了cascade和inverse同时使用上面我们已经把cascade和inverse都介绍一遍了那么cascade和inverse同时使用会怎么样呢我们来测试一下设置dept没有控制权但设置级联保存、删除添加一个dept对象//添加一个dept对象session.save(dept);如果我们单单设置了inverse属性为true那么数据库中肯定是不能维护关联关系的【这里我们已经测试了】但是呢现在也设置了级联保存级联保存是否可以让该对象相关的关联关系一并保存在数据库中的。我们来看看结果inverse的优先级是比cascade的优先级要高的因此设置了inverse属性为true那么cascade就无效了。参考详细博文:总结上面的测试都是通过几个方面的看起来有点多因此我们总结一下inverse属性inverse属性只能在“一”的一方中设置。inversefalse表示有控制权inverseture表示没有控制权在保存关联信息时有控制权---可以保存相对应的关联数据没有控制权---数据会保存但是关联关系没有维护也就是外键列为NULL在查询数据时有无控制权对查询数据没有任何影响在解除关联关系时有控制权---可以解除关联关系没有控制权---不能解除关联关系不会生成update语句也不会报错在删除数据时对关联关系的影响有控制权---将外键的值设置为NULL随后删除数据没有控制权---如果删除的记录有被外键引用会报错违反主外键引用约束如果删除的记录没有被引用可以直接删除。多对多关系的时候也是一样的只不过多对多的关联关系是在中间表中cascade属性cascade有这么几个值none 不级联操作 默认值save-update 级联保存或更新delete 级联删除save-update,delete 级联保存、更新、删除all 同上。级联保存、更新、删除我们可能使用到的往往是save-update这个值因为级联删除的风险太大了级联保存没有设置级联保存--如果单单保存一个对象而对象又存在外键时那么就会抛出异常设置了级联保存--那么就可以将对象以及有关联关系的对象一并保存级联删除没有设置级联删除--在删除数据的时候会把外键的字段设置为NULL再删除当前一方的记录设置了级联删除--把对象有关联关系的记录都删除了如果cascade和inverse同时设置时inverse属性优先级是要比cascade要高的