zoukankan      html  css  js  c++  java
  • hibernate中一对多关系中的inverse,cascade属性

    举例说明:

    一对多关系的两张表:boy、girl(一个男孩可以多个女朋友)
     boy表结构
     Field   Type        
    ------  ----------- 
     name    varchar(50)  pk
     age     varchar(50) 

     girl表结构
     Field   Type        
     ------  ----------- 
     name    varchar(50)  pk
     bf      varchar(50)  fk 
    【保存时:Inverse与cascade】
     创建三个girl对象和一个boy对象,让这是三个girl都是boy的女朋友

      ---------创建对象的代码片段-----------
      Boy boy = new Boy("tom","23", null);
     Set girls = new HashSet(); 
      Girl g[] = new Girl[]{
                            new Girl("Alice1", boy),
                            new Girl("Alice2", boy),
                            new Girl("Alice3", boy)};
      girls.add(g[0]);
      girls.add(g[1]);
      girls.add(g[2]);
      boy.setGirls(girls); 
     在Boy.hbm.xml中设置,然后对boy对象进行保存。
    1.Inverse = true,不指定cascade
       cascade的默认值为none, 当对boy进行保存操作时,girl什么都不做. 所以只保存了boy对象, 没有保存girl对象
    2.Inverse = true,cascade=all
       boy与girl对象,包扩外键都成功保存。
    (生成3条SELECT语句和4条INSERT语句,一下简称SELECT 3, INSERT 4)
    3.Inverse = false,不指定cascade
       报错。因为boy为主控方,负责维护关系,所以在插入boy对象后,会尝试修改并不存在的girl对象。
     4.Inverse = false,cascade=all
       boy与girl对象,包扩外键都成功保存。
       (SELECT 4, INSERT 4, UPDATE 3)
     分析:除了4条INSERT语句之外,其他的6条语句是我们为了图方便付出的代价:3条SELECT语句用来判断girl对象是否在数据表中已经存在,3条UPDATE语句是为了维护外键关系
    高效率的做法:在Boy.hbm.xml中设置Inverse=true,在Girl.hbm.xml中设置Inverse=false, cascade=all,然后保存三个girl对象
     (SELECT 1, INSERT 4)
    高效率的代价就是保存的时候比较麻烦
    【删除时:Inverse与cascade】
    希望通过删除boy,也将3个girl对象删除。程序中先查出boy对象,然后进行删除
      -----------------------------------------
      Boy boy = (Boy) s.get(Boy.class, "tom");
      s.delete(boy);
      -----------------------------------------
     同样在Boy.hbm.xml中进行设置
    1.Inverse = true
       可以猜到结果是出错。原因:外键约束错误

     2.Inverse = false
       boy删除,girl表中外键变为null,没有删除记录 ;  
    (UPDATE 1, DELETE 1)
    3.Inverse = false, cascade = all
              全部删除  ;在删除有外键的从表时,先把从表外键置为null,然后删除主表记录,最后根据从表主键删除所有相关从表记录
       (UPDATE 1, DELETE 4)
     4.Inverse = true, cascade = all
     全部删除
     (DELETE 4)
    Inverse是hibernate双向关系中的基本概念,当然对于多数实体,我们并不需要双向关联,更多的可能会选择单向关联,况且我们大多数人一般采用一对多关系,而一对多双向关联的另一端:多对一的inverse属性是不存在,其实 它默认就是inverse=false.从而防止了在一对多端胡乱设置inverse也不至于出错。但是inverse设置不当确实会带来很大的性能影响,这点是我们必须关注的.

  • 相关阅读:
    POJ——T2186 Popular Cows || 洛谷——P2341 [HAOI2006]受欢迎的牛
    Tarjan缩点【模板】
    shell(1):网络配置、BATH环境和通配符
    STL
    J
    H
    G
    模板整理(二)
    B
    0-1背包问题
  • 原文地址:https://www.cnblogs.com/gexiaoshan/p/3585863.html
Copyright © 2011-2022 走看看