目录
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、一对多的 级联 操作
- 什么叫做级联
- 级联指的是,操作一个对象时,是否会同时操作其关联的对象。
- 级联是有方向性
- 操作“一”的一方的时候,是否操作到多的一方
- 操作“多”的一方的时候,是否操作到一的一方
3、级联保存或更新
- 保存 客户 级联 联系人:
需要在客户的配置文件中配置:
- 保存 联系人 级联 客户
需要在客户的配置文件中配置:
4、测试对象的导航
5、级联删除
- 什么叫级联删除:
- 删除一边的时候,同时将另一方的数据也一并删除。
- 删除 客户 级联删除 联系人
先查询才能删除
- 删除 联系人 级联 删除客户(基本不用)
6、一对多设置了双向关联产生多余的SQL语句
- 解决多余的SQL语句
- 单向维护:
- 使一方放弃外键维护权:
- 一的一方放弃。在set上配置inverse=”true”
- 一对多的关联查询的修改的时候。(CRM练习--)
7、区分cascade和inverse
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、多对多的其他的操作
- 给用户选择角色
- 给用户改选角色
- 给用户删除角色