2020-12-30《后端》黑马-Hibernate框架学习笔记-第3章-2020年12月30日

本文详细介绍了Hibernate框架中一对多和多对多的关联映射配置,包括创建实体、映射文件、核心配置,以及级联操作、双向关联和级联删除的使用。通过实例讲解了一对多关系的数据库建表原则,多对多关系的中间表创建,以及在实际操作中如何避免多余的SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

3.1 Hibernate的一对多关联映射

3.1.1 数据库表与表之间的关系

1、一对多关系

2、多对多关系

3.1.2 Hibernate一对多的关系配置

1、创建一个项目,引入相应jar包

2、创建数据库和表

3、创建实体

4、创建映射文件

5、创建核心配置文件

6、引入工具类

7、编写测试类

3.1.3  Hibernate的一对多相关操作

1、一对多关系只保存一边 是否可以

2、一对多的级联操作

 3、级联保存或更新

4、测试对象的导航

5、级联删除

6、一对多设置了双向关联产生多余的SQL语句

7、区分cascade和inverse

3.2  Hibernate的多对多关联映射

3.2.1 Hibernate多对多关系的配置

2、创建实体

3、创建映射

4、编写测试类

3.2.2 Hibernate的多对多的操作

1、只保存一边是否可以

2、多对多的级联保存或更新

3、多对多的级联删除(基本用不上)

4、多对多的其他的操作



3.1 Hibernate的一对多关联映射

3.1.1 数据库表与表之间的关系

1、一对多关系

什么样关系属于一对多?

        一个部门对应多个员工,一个员工只能属于某一个部门。

         一个客户对应多个联系人,一个联系人只能属于某一个客户。

        一对多的建表原则:在多的一方创建外键指向一的那一方。

 

2、多对多关系

什么样关系属于多对多?

  • 一个学生可以选择多门课程,一门课程也可以被多个学生选择。
  • 一个用户可以选择多个角色,一个角色也可以被多个用户选择。

多对多的建表原则:创建中间表,中间表至少两个字段,分别为外键指向多对多双方的主键。

 

3、一对一关系(了解)

什么样关系属于一对一?

  • 一个公司只能有一个注册地址,一个注册地址只能被一个公司注册。

一对一的建表原则:唯一外键对应(外键值不可重复)、主键对应

3.1.2 Hibernate一对多的关系配置

1、创建一个项目,引入相应jar包

 

2、创建数据库和表

(第一天资料中有语句:

E:\1新建文件夹\后端\06-Hibernate框架(学习4天)\day01_hibernate映射文件配置.hibernate入门资料\第一天资料\crm\sql)

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

一个客户对应多个联系人,一个联系人只能属于某一个客户。

  • “一”的这一方的实体

注意:如何处理一对多的关系:放置的是“多”的那一方的集合,set集合。

  • “多”的这一方的实体

注意:放置的是“一”的那一方的对象,customer

(别忘了自动生成get和set方法,这里没有列出)

4、创建映射文件

有几个实体,hibernate就应该写几个映射。

customer.hbm.xml 和 linkman.hbm.xml

  • “多”的一方的映射的创建--LinkMan

划重点:多对一-----<many-to-one>标签

<many-to-one>的三个属性:name、class、column

  • “一”的一方的映射的创建--Customer

划重点:一对多-----<set>标签、<key>标签、<one-to-many>标签

5、创建核心配置文件

hibernate.cfg.xml和log4j

(hibernate.cfg.xml的连接数据库和映射的引入改一下,除此之外和上面项目一样)

6、引入工具类

utils

7、编写测试类

注意:客户和联系人建立联系时,要建立双向联系,并保存两方。

什么叫建立双向联系?--如上,客户1关联联系人1,那么联系人1也要关联客户1。

什么是保存两方?--如上,session.save()要保存联系人和客户。

3.1.3  Hibernate的一对多相关操作

1、一对多关系只保存一边 是否可以

(上面的例子的设置关系那里是操作了两边)

如果就想保存一边,那么可以级联操作。

2、一对多的 级联 操作

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

 3、级联保存或更新

  • 保存 客户 级联 联系人:

需要在客户的配置文件中配置:

  • 保存 联系人 级联 客户

需要在客户的配置文件中配置:

4、测试对象的导航

5、级联删除

  • 什么叫级联删除:
    1. 删除一边的时候,同时将另一方的数据也一并删除。
  • 删除 客户 级联删除 联系人

先查询才能删除

  • 删除 联系人 级联 删除客户(基本不用)

6、一对多设置了双向关联产生多余的SQL语句

  • 解决多余的SQL语句
    1. 单向维护:
    2. 使一方放弃外键维护权:
      • 一的一方放弃。set上配置inverse=”true”
    3. 一对多的关联查询的修改的时候。(CRM练习--

7、区分cascadeinverse

 

3.2  Hibernate的多对多关联映射

3.2.1 Hibernate多对多关系的配置

创建表:

  •  用户表
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_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;
  • 中间表
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;

 

2、创建实体

用户的实体

角色的实体

 

3、创建映射

  • 用户的映射

  • 角色的映射

4、编写测试类

 

3.2.2 Hibernate的多对多的操作

1、只保存一边是否可以

2、多对多的级联保存或更新

  • 保存用户级联保存角色

  • 2、保存角色级联保存用户

3、多对多的级联删除(基本用不上)

  • 删除用户级联删除角色

  • 删除角色级联删除用户

 

4、多对多的其他的操作

  • 给用户选择角色

  • 给用户改选角色

  • 给用户删除角色

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值