• hibernate框架学习第四天:关联关系、外键、级联等


    一对多关联关系

      一方
      多方(外键)
    实体类
      一方:TeacherModel
        添加多方的集合Set
      多方StudentModel
        添加一方的对象
    一方配置关系
      name:一方模型中描述多方的集合对象名
      column:多方数据库表中的外键名称
      class:多方模型类名
      <set name="students">
        <key column="teacherUuid"></key>
        <one-to-many class="cn.itcast.h3.one2many.vo.StudentModel"/>
      </set>
    多方配置关系
      name:多方模型中描述一方的对象名
      class:一方模型类名
      column:多方数据库表中的外键名称
      <many-to-one
        name="teacher"
        class="cn.itcast.h3.one2many.vo.TeacherModel"
        column="teacherUuid"
      />

    关系维护
    添加数据
      1.一方数据与多方数据同时添加
        必须建立一方与多方之间的关联关系
        依靠对象建立对象间的关系
        //多方对一方的关联
        sm1.setTeacher(tm);
        sm2.setTeacher(tm);
        //一方对多方的关联
        tm.getStudents().add(sm1);
        tm.getStudents().add(sm2);
    2.单独添加
        单独添加时不需要进行关系设定
        可以进行添加,注意字段为null的设定
      添加数据时的问题
      1.在添加数据时候,PO对象不能关联TO对象,此时要抛出PO不能关联TO的异常
      解决方案:级联添加
      步骤:为添加方配置级联添加关系
      cascade = save-update
      说明:无论是一对还是多对均可以配置级联添加,但是只规定从当前方可以发起级联操作

    删除数据
    1.保留一方数据,删除多方数据
    基本操作
    2.删除一方数据,同时删除对应的多方数据(级联删除)
    步骤:为一方数据添加级联删除特性
    cascade = delete
    3.如果多方断开了与一方的关联,此时多方数据不需要保留,对其进行删除(孤子删除)
    步骤:断开一与多的关系
    cascade = delete-orphan
    重要:cascade属性不仅维护级联对象,而且还维护级联关系

    关系维护 inverse
    在一对多的关联关系中,通常使用多方数据来进行关系维护,而一方不需要具有关系维护的能力
    为不具有关系维护能力的一方设置inverse = "true" 可以让当前设置方丧失关系维护权
    重要:inverse属性维护关联关系

    ------------------------------------------------
    多对多关系

    左方:正常(无外键)
    右方:正常(无外键)
    关系表:双方外键
    模型
    全部都要加对方的集合Set
    hbm.xml配置
    双方配置完全相同
    <set
    name="students" 当前模型的集合对象名
    table="tbl_relation" 关系表名
    >
    <key column="teacherUuid"/> 当前模型在关系表中的外键
    <many-to-many 配置关系
    class="cn.itcast.h3.many2many.vo.StudentModel" 关联关系对方对象的模型类名
    column="studentUuid" 关联关系对方对象在关系表中的外键
    />
    </set>

    操作:
    单独添加
    基本H3操作
    同时添加
    绑定关系后,双方都进行关系维护,此时会添加对关系进行两次维护
    解决方案:规定一方为从方,使其失去关系维护权,inverse = "true"
    添加关联关系
    将主从双方没有关联关系的对象,互相添加关联关系
    tm.getStudents().add(sm);
    sm.getTeachers().add(tm);
    删除关联关系
    同添加关联关系
    sm.getTeachers().remove(tm);
    tm.getStudents().remove(sm);
    变更关联关系
    先断开之前的关系 DELETE
    //先解除关系
    tm1.getStudents().remove(sm);
    sm.getTeachers().remove(tm1);
    然后添加新的关系 INSERT
    //再添加关系
    tm2.getStudents().add(sm);
    sm.getTeachers().add(tm2);
    删除数据
    单独删除
    级联删除(不建议)
    -----------------------
    一对一关联关系
    外键配置方式

    主方:正常
    从方:添加外键约束
    模型
    添加对应模型对象
    配置关系
    主方:
    <one-to-one
    name="wife" 主方关联关系对象名
    class="cn.itcast.h3.one2one.vo.WifeModel" 从方模型类名
    property-ref="husband" 从方关联关系对象名
    />
    从方:
    <many-to-one
    name="husband" 从方关联关系对象名
    class="cn.itcast.h3.one2one.vo.HusbandModel" 主方模型类名
    column="husbandUuid" 外键字段名
    unique="true" 设定唯一性
    />
    主外键配置方式

    主方:正常
    从方:不添加外键,主键不能做自增
    模型
    添加对应模型对象
    配置关系
    主方:
    <one-to-one
    name="wife"
    class="cn.itcast.h3.one2one.vo.WifeModel"
    />
    从方:
    主键约束方式发生改变
    <id name="uuid">
    <generator class="foreign"> 生成策略改为外部提供
    <param name="property">husband</param> 设置生成策略由属性提供property
    属性提供的属性名为husband
    </generator>
    </id>
    <one-to-one
    name="husband"
    class="cn.itcast.h3.one2one.vo.HusbandModel"
    constrained="true" 约束为为主键约束
    />
    2种配置完成,操作功能完全一样
    操作
    单独添加
    主方:
    从方:从方必须依赖于主方的关联关系才可以添加
    同增
    直接绑定关系就可以进行
    级联删除
    读取主方数据,然后配置级联删除操作cascade = delete

    -------------------------------------------------------------
    总结:
    对象的状态
    TO
    PO
    DO
    区别
    转换
    一级缓存
    实质
    多个,不是唯一的
    一级缓存的操作
    存在性
    关联关系
    一对一
    一对多
    多对多

    表的制作:
    模型制作:
    配置:

    cascade:规定了级联操作的种类,【同时维护关系】基于inverse=false
    inverse:规定了是否维护关系

    关联关系中对象的操作是通过 add remove set 操作

  • 相关阅读:
    Java异常简介
    Java中的接口
    Java中的抽象类
    Java的多态
    关于this
    面向对象的继承方式详解
    1像素边框问题
    HTML5之本地存储SessionStorage
    js数组去重的4个方法
    前端模块化
  • 原文地址:https://www.cnblogs.com/xyhero/p/9348823.html
Copyright © 2020-2023  润新知