• hibernate 映射总结


    单向一对多
    实体配置:在一的实体中设置多的一方SET集合
    配置文件:在一的一方用set 设置 one to many
    表配置:多方表的外键指向一方表的主键;

    双向一对多
    实体配置:在一的实体中设置多的一方SET集合,在多的一方的实体中配置一的一方的属性
    配置文件:在一的一方用set 设置 one to many,对多的一方设置many-to-one
    表配置:多方表的外键指向一方表的主键;


    让某一方放弃外键的维护,为多对多映射做准备: inverse
    在修改客户和联系人的关系时,进行双向关联,双方都会维护外键,会产生多余的 SQL 语句.
    产生的原因: session 的一级缓存中的快照机制,会让双方都更新数据库,产生了多余的 SQL 语句.
    如果不想产生多余的 SQL 语句,那么需要一方来放弃外键的维护, 由多方来维护!
    // 放弃外键维护
    // Customer.hbm.xml 进行如下配置
    <set name="linkman" inverse="true"> // true 表示放弃; 默认值为 false
    <key column="lkm_cust_id"/>
    <one-to-many class="com.itheima.domain.Linkman"/>
    </set>

    多对多映射
    实体配置:双方都有Set集合
    配置文件: 在多的一方配置另一个多的一方,需要中间表 // 配置多对多
    // name 表示集合的名称
    // table 表示中间表的名称
    <set name="roles" table="sys_user_role" inverse="true">
    // 当前对象在中间表的外键名称
    <key column="user_id"/>

    // class : 集合中存入的对象,对象的全路径
    // column: 集合中对象,在中间表的外键名称
    <many-to-many class="com.itheima.domain.Role" column="role_id"/>
    </set>
    表配置:需要中间表,中间表的外键指向两个表的主键;

    单向一对一主键关联
    实体配置:配置被控制端的实体
    配置文件:需要在控制端配置被控制端,

    主键生成策略 因为主键跟外键是同一个,所以直接在这里申明该主键就是外键,并且指向了被控制端这个类
    <!--由于在申明主键的时候已经将关系写清楚了,所以在这里没有column这个属性。按平常的习惯,我们会在这里写上column="数据库中外键字段属性名称。"-->
        <!--constrained属性:就是表明我们的主键当外键使用了。 这个属性两个作用,一是通知这种对应关系在上面已经写过了,所以这里才不需要写column,二是表明这种关系是什么,也就是主键当外键。
          其实还有一个级联关系的作用,这里不做多说明,具体会在这章之后一起讲解,不然会让人感觉很混乱。-->
    <one-to-one name="idCard" constrained="true"></one-to-one>

    双向一对一主键关联
    实体配置:在控制端配置被控制端的实体,在被控端配置控制端的实体
    配置文件:需要在控制端配置被控制端,
    主键生成策略 因为主键跟外键是同一个,所以直接在这里申明该主键就是外键,并且指向了被控制端这个类
    <!--由于在申明主键的时候已经将关系写清楚了,所以在这里没有column这个属性。按平常的习惯,我们会在这里写上column="数据库中外键字段属性名称。"-->
        <!--constrained属性:就是表明我们的主键当外键使用了。 这个属性两个作用,一是通知这种对应关系在上面已经写过了,所以这里才不需要写column,二是表明这种关系是什么,也就是主键当外键。
          其实还有一个级联关系的作用,这里不做多说明,具体会在这章之后一起讲解,不然会让人感觉很混乱。-->
    <one-to-one name="idCard" constrained="true"></one-to-one>

    被控制端配置: <one-to-one name="person"></one-to-one>

    单向一对一外键关联 多对一的一个特例
    实体配置:在被看做多的一端配置另一端的一个实体
    配置文件:在被看做多的一端配置
     <!--跟多对一一样,只是增加了一个unique属性。这样就指定了这端为一了。-->
    <many-to-one name="idCard" column="cardId" unique=true></many-to-one>

  • 相关阅读:
    JAVA识别字符串是数字(英文)还是汉字,web页面进行字符截断的帮助类
    linux不解压超大日志gz包直接查找特定内容
    Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
    Caffe学习系列(10):命令行解析
    Caffe学习系列(9):运行caffe自带的两个简单例子
    Caffe学习系列(8):solver优化方法
    Caffe学习系列(7):solver及其配置
    Caffe学习系列(6):Blob,Layer and Net以及对应配置文件的编写
    Caffe学习系列(5):其它常用层及参数
    Caffe学习系列(4):激活层(Activiation Layers)及参数
  • 原文地址:https://www.cnblogs.com/Jeely/p/11229661.html
Copyright © 2020-2023  润新知