• hibernate笔记--cascade级联以及inverse属性


    cascade : 

      不管是单向多对一还是一对多,或者是双向的一对多关系,在一的一端映射文件中有一个set标签,在多的一端有many-to-one标签,拿前几篇笔记里讲的Grade和Student举例,此标签下都有一个cascade属性:

      Grade.hbm.xml中:

    <set name="students" cascade="save-update">
            <key column="gradeId" ></key>
            <one-to-many class="Student"/>
        </set>

    Student.hbm.xml中:

    <many-to-one name="grade" class="Grade" column="gradeId" not-null="true" cascade="save-update"></many-to-one>

    cascade表示级联:让操作级联到子实体,常见的有以下几个取值:

    save-update:在保存和当前一端数据时,另一端数据可以一起保存.如上,假如Student.hbm.xml中设置了 cascade="save-update",那么在保存数据时,只需要保存Student就可以,hibernate会自动把它相关联的另一端的Grade的数据保存起来.

    none:不级联(不写就是默认不级联)

    delete:删除级联(不能在多的一端执行)

    all:表示所有操作都级联

    注意:

    1. cascade是级联操作,使得在一段操作数据时,可以级联操作在另外一端的数据
    2. 在多对一的关系中,多的一端不能操作级联为delete,一般在多的一端设为save-update
    3. 在一对多的关系中,如果一的一端设置为delete,多的一端不能指明外键为空

    inverse:

      在一的一端(Grade)的<set>标签中有一个inverse属性,:

    <set name="students" inverse="false">
            <key column="gradeId" ></key>
            <one-to-many class="Student"/>
    </set>

    inverse属性表示由谁来管理关联关系,默认为false.

    inverse="false":表示双方都可以管理关联关系,谁管理关系谁来维护,如果都管理了则双方都可以维护,当关系由多的一端(Student)来维护时,效率更高.因为如果关系由一的一端(Grade)来维护时,会多执行几个Update语句.

    inverse="true":表示由多的一端来管理关联关系,不管一的一端是否管理关系,都由多的一端来维护关系.建议设为"true".

      那么什么是管理关系呢? 假设Student中,执行了setGrade()方法时,将Grade实例赋给了Student实例,就表示Student类管理了关系,这到底什么意思呢?其实很简单,假如保存数据的时候,我们保存Student信息时,引用了Grade,那么保存时会维护Student和Grade的关系,即会在Student中存在Grade的外键值,否则,Student的外键值是为null的(当然前提是我们没有设置not-null="true"),

  • 相关阅读:
    洛谷⑨月月赛Round2 官方比赛 OI
    3243 区间翻转
    3279 奶牛健美操
    1959 拔河比赛
    2144 砝码称重 2
    BZOJ1999 树网的核[数据加强版]
    U4704 函数
    U4687 不无聊的序列
    U4699 鸡蛋
    UVA 11212 Editing a Book
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5239170.html
Copyright © 2020-2023  润新知