• Hibernate关联映射(一对多/多对多)


    版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/84340105
    3.  Hibernate关联映射
    上接Hibernate持久化类:https://blog.csdn.net/biggerchong/article/details/84260707

    目录
    3.  Hibernate关联映射

    3.1 数据库表之间的关系

    3.1.1 一对多关系

    3.1.2 多对多关系

    3.1.3 一对一关系(实际开发中使用较少)

    3.2 实战Hibernate一对多关联映射

    3.2.1 创建数据表(客户----联系人)

    3.2.2 创建Java项目Hibernate5Study3

    3.2.3 创建持久化类(Customer、LinkMan)

    3.2.4 创建文件映射关系

    3.2.5 Hibernate核心映射

    3.2.6 测试一对多关联映射

    3.2.7 一对多级联操作

    3.2.8 双向级联产生多余SQL

    3.3 实战多对多关联映射

    3.3.1 创建表

    3.3.2 创建实体

    3.3.3 创建映射

    3.3.4 编写测试类

    3.1 数据库表之间的关系
    3.1.1 一对多关系
    一张表中的一条记录对应另一张表中的多条记录;反之不成立。

    一对多关系建表原则:

    3.1.2 多对多关系
    一张表中的一条记录对应另一张表中的多条记录;反之也成立。

    多对多关系建表原则:

    3.1.3 一对一关系(实际开发中使用较少)
    一张表中的一条记录对应另一张表中的唯一一条记录;反之也成立。(可以用一张表替代)

    一对一关系建表原则:

    3.2 实战Hibernate一对多关联映射
    3.2.1 创建数据表(客户----联系人)
    客户表:

    CREATE TABLE `cst_customer` (

      `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',

      `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',

      `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',

      `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',

      `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',

      `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',

      `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',

      PRIMARY KEY (`cust_id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    联系人表:

    CREATE TABLE `cst_linkman` (

      `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',

      `lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',

      `lkm_cust_id` bigint(32) DEFAULT NULL COMMENT '客户id',

      `lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',

      `lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',

      `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',

      `lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',

      `lkm_qq` varchar(16) DEFAULT NULL COMMENT '联系人qq',

      `lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',

      `lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',

      PRIMARY KEY (`lkm_id`),

      KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),

      CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    客户-----联系人关系图(一对多关系):

    3.2.2 创建Java项目Hibernate5Study3
    引入相应Jar包 并build path

    3.2.3 创建持久化类(Customer、LinkMan)
    Customer:

    LinkMan:

    并加上相应得到getter/setter方法,构造函数

    3.2.4 创建文件映射关系
    LinkMan.hbm.xml文件:

    Customer.hbm.xml文件:

    3.2.5 Hibernate核心映射
    红框内注意,其他与之间介绍的一样。

    3.2.6 测试一对多关联映射


     

    3.2.7 一对多级联操作
    级联:操作一个对象的时候,会同时操作与其相关联的对象。

    级联方向性:

    从one到many的方向:操作one对象能同时操作many对象
    从many到one的方向:操作many对象能同时操作one对象
    级联保存或更新

    从one到many的方向:改变one(Customer.hbm.xml)的映射文件

    从many到one的方向:改变many(LinkMan.hbm.xml)的映射文件

    注:注意级联方向,session.save(…);会产生级联关系的保存(隐式保存)

    级联删除:关联起来同时删除

             在没有配置的情况下,Hibernate默认先将关联外键取消置为null,然后再删除指定记录,不会进行级联删除

    下面在对应的映射文件中进行配置实现级联删除(仍然具有方向性):

             LinkMan.hbm.xml文件(基本不用)

             Customer.hbm.xml文件

    3.2.8 双向级联产生多余SQL


    解决多余的SQL语句:

    单向维护
    使一方放弃外键维护权:one的一方放弃。在set上配置inverse=”true”
     

    说明:cascade控制级联关系,inverse控制外键关联关系(inverse=”true”取消外键关联关系)

    3.3 实战多对多关联映射
    3.3.1 创建表
     用户表

    CREATE TABLE `sys_user` (

      `user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',

      `user_code` varchar(32) NOT NULL COMMENT '用户账号',

      `user_name` varchar(64) NOT NULL COMMENT '用户名称',

      `user_password` varchar(32) NOT NULL COMMENT '用户密码',

      `user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',

      PRIMARY KEY (`user_id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    角色表

    CREATE TABLE `sys_role` (

      `role_id` bigint(32) NOT NULL AUTO_INCREMENT,

      `role_name` varchar(32) NOT NULL COMMENT '角色名称',

      `role_memo` varchar(128) DEFAULT NULL COMMENT '备注',

      PRIMARY KEY (`role_id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    中间表

    CREATE TABLE `sys_user_role` (

      `role_id` bigint(32) NOT NULL COMMENT '角色id',

      `user_id` bigint(32) NOT NULL COMMENT '用户id',

      PRIMARY KEY (`role_id`,`user_id`),

      KEY `FK_user_role_user_id` (`user_id`),

      CONSTRAINT `FK_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,

      CONSTRAINT `FK_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

     
    3.3.2 创建实体
    用户的实体

    角色的实体

     
    3.3.3 创建映射
    用户的映射

    角色的映射

    3.3.4 编写测试类


    说明:多对多关联映射中也存在级联更新保存与删除,与前面介绍的一对多级联更新保存与删除是一样的配置映射文件,如下图:

    User.hbm.xml文件

    Role.hbm.xml文件

             注:一般将被动关联方(Role被User来选)的inverse设为“ture”

    多对多关系中级联删除是不合理的,常规情况下不会使用;最常使用的是改选关联关系、删除关联关系、添加关联关系,这三种在实际应用中最为常见,都是遵循先get/load查询在操作关联关系(remove/add),然后session.save()、session.delete()、session.update()即可。

    下接Hibernate查询与抓取策略(优化):https://blog.csdn.net/biggerchong/article/details/84402907        

                                                                                                                       -----谢谢阅读!                  ------知飞翀
    ---------------------
    作者:知飞翀
    来源:CSDN
    原文:https://blog.csdn.net/biggerchong/article/details/84340105
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Javascript 面向对象编程
    __dirname与__filename
    解决动画播放完后恢复到初始状态的问题
    基于jQuery滚动加载页面内容效果的插件封装
    JQuery 方法
    CSS 尺寸介绍
    原生JS组件编写,构造函数封装步骤
    面试题原型链
    基础面试题——什么是盒子模型
    数组去重方法
  • 原文地址:https://www.cnblogs.com/Jeely/p/11226263.html
Copyright © 2020-2023  润新知