zoukankan      html  css  js  c++  java
  • Hibernate中Inverse和Cascade

    InversecascadeHibernate映射中最难掌握的两个属性。两者都在对象的关联操作中发挥作用。
    1.inverse属性:inverse所描述的是对象之间关联关系的维护方式。
      inverse只存在于集合标记的元素中。Hibernate提供的集合元素包括<set/> <map/> <list/> <array /> <bag />
      Inverse属性的作用是:是否将对集合对象的修改反映到数据库中。
      inverse属性的默认值为false,表示对集合对象的修改会被反映到数据库中
      inverse=”true”  表示对集合对象的修改不会被反映到数据库中。
    <one-to-many>inverse的属性的设置
    例:Person中包含一个Child集合,Child包含一个Person对象。
    要求:新建PersonChild对象,Child属于此Person对象
    分析:在数据库中,就是新增一条Child记录
        //one-to-many的inverse的配置
        public void testInverse() {
           Qx qx = new Qx();
           qx.setQx("天山区");
           Jd jd = new Jd();
           jd.setJd("人民路");
           qx.getJds().add(jd);
           jd.setQx(qx);
           super.add(qx);
           super.add(jd);
    }
    配置Inverse=”false”Hibernate的操作:
    (1)Hibernate: insert into TBL_QX (qx) values (?)
    (2)Hibernate: insert into TBL_JD (jd, qxid) values (?, ?)
    (3)Hibernate: update TBL_JD set qxid=? where jdid=?
    配置Inverse=”true”Hibernate的操作
    (1)Hibernate: insert into TBL_QX (qx) values (?)
    (2)Hibernate: insert into TBL_JD (jd, qxid) values (?, ?)
    可以看出:Inverse=”true”SQL少执行一条更新操作(Java代码不会少)

    <many-to-many>inverse的属性的设置
    在多对多的关系中,可以在关联的两边都不设置inverse属性(默认的false,那么说明关联的双方都可以维护两个对象之间的关联关系。
    注:在设置多对多关系的inverse属性时,不能两个对象都将其设置为true

    2.cascade属性
    cascade属性的作用是描述关联对象进行操作时的级联特性。因此,只有涉及到关系的元素才有cascade属性。
    具有cascade属性的标记包括<many-to-one /> <one-to-one /> <any /> <set /><bag /> <idbag /> <list /> <array />
    注意:<ont-to-many /> <many-to-many />是用在集合标记内部的,所以是不需要cascade属性的。
    级联操作:指当主控方执行某项操作时,是否要对被关联方也执行相同的操作。

    3.inversecascade的区别
    作用的范围不同:
        Inverse是设置在集合元素中的。
       Cascade对于所有涉及到关联的元素都有效。
       <many-to-one/><ont-to-many/>没有inverse属性,但有cascade属性
    执行的策略不同
       Inverse 会首先判断集合的变化情况,然后针对变化执行相应的处理。
       Cascade 是直接对集合中每个元素执行相应的处理
    执行的时机不同
        Inverse是在执行SQL语句之前判断是否要执行该SQL语句
        Cascade则在主控方发生操作时用来判断是否要进行级联操作
    执行的目标不同
        Inverse对于<ont-to-many><many-to-many>处理方式不相同。
      对于<ont-to-many>inverse所处理的是对被关联表进行修改操作。
      对于<many-to-many>inverse所处理的则是中间关联表
        Cascade不会区分这两种关系的差别,所做的操作都是针对被关联的对象。

    总结:
    <one-to-many>中,建议inverse=”true”,由“many”方来进行关联关系的维护
    <many-to-many>中,只设置其中一方inverse=”false”,或双方都不设置
    Cascade,通常情况下都不会使用。特别是删除,一定要慎重

  • 相关阅读:
    TVM性能评估分析(七)
    TVM性能评估分析(六)
    理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
    理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
    (转)浅谈 SOLID 原则的具体使用
    老一辈的革命先烈告诉我,凡事打好提前量
    理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
    实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
    实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?
    12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
  • 原文地址:https://www.cnblogs.com/soundcode/p/1911934.html
Copyright © 2011-2022 走看看