hibernate 一对多一对一 ,多方与一方增删改查测试结果

xiaoxiao2021-02-28  59

——-------------------------------------------------------------------   关于orcal表结构的外键的onDelete设置,如果这里配置了级联,在数据库中 主表删除数据,从表也一块删除,但从表删除主表不变。但这里配置了,实体没配置级联,程序还没法完成级联操作。程序配置了级联,这里不管设置成啥,都可级联删除。 一对一或者一对多,主表的实体关联属性的作用:1.相互包含,和从表一同保存。2.查询时候封装拿到从表的值。不能单方面set从表()保存。 一对一或者一对多,从表的实体关联属性的作用:1.相互包含,和主表一同保存。2.查询时候封装拿到主表的值。能单方面set主表()保存。 级联的作用:1.只有在相互包含一起保存的时候,胜率一方最后的保存步骤,没有级联大不了都保存呗。2.删除的时候,能同时删除关联的对方数据 1.一对一 外键  双向 一方级联 表结构: B外键指向A主键 实体结构: A B主键各自使用UUID自动生成 A放弃外键维护,配置级联 B方无级联配置 ---------------------------------------------------------------------------- 测试一方A保存: A放弃外键维护,不管是否配置级联,A.setb 保存报错 A放弃外键维护,不管是否配置级联,A单独保存成功 @OneToOne(cascade=CascadeType.ALL),A.setb 保存报错,相互包含保存出错,A单独保存出错 @OneToOne A单独保存报错,A.setb报错, 相互包含报错 结论:一对一双向关联,A方为主表,首先A实体必须放弃外键维护权,不然怎么保存A,删除A,查询A都会报错。放弃了外键以后,就可以单独操作A表了 只能单独保存A(setb为null),但如果想同时保存B,就要相互包含,不同的是配置级联,最后只用saveA,没配置级联,saveA 再saveB ------------------------------------------------------------------------ 测试一方删除: @OneToOne 不放弃外键维护 保存 查询 没有建立关联的数据,根据id删除, 全报错 @OneToOne(mappedBy="a") 放弃外键维护 没级联 没有建立关联的数据,根据id删除成功 建立关系的数据,根据id删除失败(数据库外键设置的不能为空) 建立关系的数据,根据id删除失败(数据库外键设置的能为空,且外键的on delete 设置为set null)   @OneToOne(mappedBy="a",cascade=CascadeType.ALL) 放弃外键  配置及联 建立关系的数据,根据id删除成功,从表数据也一块删除 没有建立关联的数据,根据id删除成功     结论:双向关联,一方首先放弃外键维护权,不然啥也干不了。放弃后,只能删除没建立关系的数据,配置级联后,就可以删除那些建立关系的数据了 ---------------------------------------------------------------------------------------- 测试一方查询: 只要放弃外键,就可以产寻,可以查到没关联的数据(实体b属性为空),也可以查到关联数据(实体b属性也封装好了) ------------------------------------------------------------------------------------ 多方的操作,和一方什么配置没关系 测试多方保存 如果外键字段可为空,就可单独保存B(seta为null), 如果要setA(),不管是new的还是查的,a的id一定是A表中已经存在的,这样B.seta才能保存成功。如果想双向同时保存,那就相互包含。先保存A,再保存B,B方配置级联,最后只保存B即可 测试多方查询 根据id查询,自动给B中封装a属性的值,如果是单独数据,a就为null 测试多方删除 根据id删除,这个就是单表删除,如果配置级联,才会和主表一块删除 -------------------------------------------------------------------------- 一对一外键单向关联: 1.一般让从表的实体保留关联属性,这样主表就是单表操作,从表实体可以利用关联属性,set主表()保存,利用关联属性查询封装主表值,但因为主表实体没有关联属性,不能通过实体操作完成相互包含一同保存。 从表实体保留关联属性: 主表正常单表查询,别考虑放弃外键什么的 主表正常单表保存 主表id删除,单独项正常删除,关联项不能删除(除非外键可为空,且Ondelete 为set null) 从表正常单表删除 丛表正常查询,封装A数据 保存就要seta的id了 如果主表方实体保留关联属性,主表不能set从表()保存,这是也不能相互包含一同保存。从表应为没有属性,没法set主表()保存,他们成了两张单独的表,失去实际意义。 一对一主键双向关联  
转载请注明原文地址: https://www.6miu.com/read-31675.html

最新回复(0)