hibernat入门3(以一对多为例)

  • 数据库表与表之间的关系
    1.一对一(很少,了解):
    在这里插入图片描述

上面有针对一对一的关系提供了两种建表原则:
1.唯一外键对应
2.主键对应

2.一对多(重点):
在这里插入图片描述

上面的例子是联系人是多的一方,所以建表原则为在多的一方建外键

3.多对多(拆分成一对一):
在这里插入图片描述

上面是学生和课程之间的多对多的关系,建表原则为建立一张中间表,中间表中至少两个字段,这两个字段同时作为主键和外键,外键分别对应学生表和课程表。

  • hibernate一对多的配置
    1.创建项目,引入jar包
    2.创建数据库和表

      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.创建实体

一的一方的实体
在这里插入图片描述
多的一方的实体
在这里插入图片描述

4.创建配置文件

多的一方的映射文件
在这里插入图片描述
一的一方的映射文件
在这里插入图片描述

5.创建核心配置文件和工具类(见入门1和入门2)
6.测试

在这里插入图片描述

  • 一对多的相关操作
    从上面的案例不难看出,我们要保持客户和联系人时需要操作双方,也就是session.save(customer)和session.save(linkMan)。因为操作一方会抛出瞬时态对象异常,这是需要在配置中添加级联操作。

      1)什么叫做级联?
      	级联指的是,操作一个对象的时候,是否会同时操作其关联的对象。
      2)级联是有方向性?
      	操作一的一方的时候,是否操作到多的一方
      	操作多的一方的时候,是否操作到一的一方
    

如果我们希望在操作一的一方的时候操作多的一方,就需要在一的一方的set标签上添加cascade=“save-update”;反过来,如果希望在操作多的一方的时候操作一的一方,就需要在多的一方的many-to-one标签上添加cascade=“save-update”。

  • 一对多设置了双向关联产生多余的SQL语句
    在这里插入图片描述
    怎么解决多余的sql:
    单向维护,使一方放弃外键维护权,一的一方放弃,在set上配置inverse=”true”。

  • 区分cascade和inverse
    在这里插入图片描述

为什么会出现外键为null呢?
我们在保存客户的时候,通过级联操作会保存联系人,但是客户这一放却放弃了外键的维护权,所以会出现外键为null,这个时候我们应该使用联系人来操作客户。

猜你喜欢

转载自blog.csdn.net/Roriring/article/details/89027978