Hibernate知识点小结(三)-->一对多与多对多配置
一、多表关系与多表设计
1、多表关系
一对一:
表的设计原则(分表原则):
优化表的性能
基于语意化分表
一对一的两张表 之间的关系怎么维护?
主外键
相同主键值
一对多:
建表原则:
在一的一方有主键 主表
多的一方有与主表的主键相关联外键 从表
多对多
建表原则:
两种主表(业务表) 中间存在一张中间表
中间表内部维护两个外键
中间表分为两种:
仅仅维护关系的中间表
不仅存在维护关系的外键 还有其他业务字段 例如:订单表 订单项表 商品表
2、多表设计
根据业务设计表模型
分析表的关系: 分方向 看一条(起始表)
一对一设计:
学生表 学籍表
一对多设计:
客户表 联系人表
百度 张三
jd 李四
google 王武
赵六
田七
孙八
多对多设计(权限5张表):
1、通过用户名和密码才能登陆
2、系统有不同的职务
3、不同的职务可以有不同的权限
用户表 职务表(角色表) 权限表(菜单表、功能表)
张三 CEO 查下自己薪资
李四 CTO 查看全部人薪资
王武 CFO 请假
田七 COO 批假
程序员 查看项目进度
查看项目金额
用户角色关系表 角色权限关系表
二、hibernate一对多的配置(重点)
基于的模型 客户与联系人
1、创建实体:
Customer实体
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
//当前客户有哪些联系人 一个客户可以包含多个联系人
private Set<Linkman> linkmans = new HashSet<>();
Linkman实体
private Long lkm_id;
private String lkm_name;
private String lkm_gender;
private String lkm_phone;
private String lkm_mobile;
//private Long lkm_cust_id; //当前联系人属于哪一个客户
private Customer customer;
2、单实体的映射配置:
Customer.hbm.xml
<class name="com.itheima.domain.Customer" table="cst_customer">
<id name="cust_id">
<generator class="native"></generator>
</id>
<property name="cust_name"></property>
<property name="cust_source"></property>
<property name="cust_industry"></property>
<property name="cust_level"></property>
<property name="cust_phone"></property>
<property name="cust_mobile"></property>
</class>
Linkman.hbm.xml
<class name="com.itheima.domain.Linkman" table="cst_linkman">
<id name="lkm_id">
<generator class="native"></generator>
</id>
<property name="lkm_name"></property>
<property name="lkm_gender"></property>
<property name="lkm_phone"></property>
<property name="lkm_mobile"></property>
</class>
3、一对多映射关系的配置:
Customer.hbm.xml
<!--
配置一对多 一个Customer 对应多个 联系人
private Set<Linkman> linkmans = new HashSet<>();
Set标签name属性:Set集合的名称 (当前实体使用哪个变量与对方维护关系)
key标签的column:外键的名称
one-to-many标签的class:对方的全限定名
-->
<set name="linkmans">
<key column="lkm_cust_id"></key>
<one-to-many class="com.itheima.domain.Linkman"/>
</set>
Linkman.hbm.xml
<!--
配置多对一
private Customer customer;
name:当前实体使用哪个变量与对方维护关系
class:对方的全限定
column:外键名称
-->
<many-to-one name="customer" class="com.itheima.domain.Customer" column="lkm_cust_id"></many-to-one>
4、一对多的添加操作
级联保存:在保存一方时 于此同时保存与该方有关系的其他对象
cascade="save-update"
级联删除:在删除一方时 于此同时删除与该方有关系的另一方
cascade="delete"
放弃外键维护权
inverse="true"
inverse直译:反转(反转外键维护权) 该方放弃外键维护权
结论:
在开发中 习惯在一的一方配置级联操作(cascade) 在一的一方配置放弃外键维护权(inverse="true")
<set name="linkmans" cascade="save-update,delete" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="com.itheima.domain.Linkman"/>
</set>
5、查询
知识点:延迟加载 lazy="true/false"
查询一的一方 多的一方默认是延迟加载
三、hibernate多对多的配置
模型配置:
user 和 role
User:
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private String user_state;
//当前该用户具备哪些角色
private Set<Role> roles = new HashSet<>();
Role:
private Long role_id;
private String role_name;
private String role_memo;
//当前该角色被哪些用户使用
private Set<User> users = new HashSet<>();
映射关系的配置:
User.hbm.xml
<set name="roles" table="sys_user_role">
<key column="uid"></key>
<many-to-many class="com.itheima.domain.Role" column="rid"></many-to-many>
</set>
Role.hbm.xml
<set name="users" table="sys_user_role">
<key column="rid"></key>
<many-to-many class="com.itheima.domain.User" column="uid"></many-to-many>
</set>
Hibernate知识点小结(三)-->一对多与多对多配置的更多相关文章
- 2.1、Hibernate多表操作--一对多、多对一、多对多。
一.什么是一对一.一对多.多对一及多对多关系(以简单的学生和老师的关系为例来说): 1.一对一:学生具有学号和姓名(假定没有同名的学生)这两个属性,那么我知道了学生的学号也就能找到对应的学生姓名,如果 ...
- Hibernate之关联映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习一下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- hibernate一对多和多对一配置
public class Dept { private int deptId; private String deptName; // [一对多] 部门对应的多个员工 private Set<E ...
- EF 一对一、一对多、多对多配置语句小记
数据库实体间的关系无非有这么几种:一对一.一对多.多对多,这些关系在EF框架中分别有不同的创建方式: 1.在"Database First"模式中,这些关系通过SQL语句的方式建立 ...
- mybatis 一对多,多对一配置
一. 简介: 本实例使用顾客和订单的例子做说明: 一个顾客可以有多个订单, 一个订单只对应一个顾客 二. 例子: 1. 代码结构图: 2. 建表语句: CREATE DATABASE test; US ...
- 面试题:hibernate第三天 一对多和多对多配置
1.1 一对多XML关系映射 1.1.1 客户配置文件: <?xml version="1.0" encoding="UTF-8"?> <!D ...
- Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XM ...
- Hibernate知识点小结汇总
Hibernate部分 1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复 ...
随机推荐
- 2017年9月22日 关于JS数组
JS数组 JS数组的定义方法 var arr = []; var arr = new Array() JS数组属性 长度 arr.length 遍历数组 索引值:从0开始数 第一种方法 for(var ...
- oracle UDT 有关数据字典的研究
1.数据及类型准备 创建了一个自定义类型 create or replace type addr_type as object( street varchar2(30); city varchar2( ...
- HDU 1003 最大连续和
http://www.acmerblog.com/hdu-1003-Max-Sum-1258.html 这里难点只有求起始位置,把握状态变化就行.一般这种子序列问题,都可以用dp简化 #include ...
- 正则表达式备忘录-Regular Expressions Cheatsheet中文版
正则表达式备忘录Regular Expressions Cheatsheet中文版原文:https://www.maketecheasier.com/cheatsheet/regex/ 测试文件a.t ...
- Azure 10月新公布
Azure 10月新发布:F 系列计算优化实例,认知服务,媒体服务流式处理单元更名,Azure 镜像市场,FreeBSD 适用于Azure 虚拟机的全新 F 系列计算优化实例 Azure 虚拟机的全新 ...
- 深入JDK源码,这里总有你不知道的知识点!
Java的基础知识有很多,但是我认为最基础的知识应该要属jdk的基础代码,jdk的基础代码里面,有分了很多基础模块,其中又属jdk包下面的lang包最为基础. 我们下面将总结和分析一下lang包下面最 ...
- Win+Tab键实现自定义程序列表间的窗口切换
程序是用AutoHotkey语言写的, 说明: 以自己使用频率的顺序在ExeList自定义的程序间切换 切换可以以所有窗口切换,也可以按程序组切换(比如在word窗口间切换) 程序组可以分别定义排除的 ...
- NO.009-2018.02.14《临江仙·送钱穆父》宋代:苏轼
临江仙·送钱穆父_古诗文网 临江仙·送钱穆父 宋代:苏轼 一别都门三改火,天涯踏尽红尘.依然一笑作春温.无波真古井,有节是秋筠.自从我们在京城分别一晃又三年,远涉天涯你奔走辗转在人间.相逢一笑时依然像 ...
- 简单的PHP算法题
简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...
- linux下修改apt下载源
很多时候使用apt install命令会出现Unable to fetch somearchives的错误,我们需要运行以下apt update,可是经常会出现下载速度很慢的情况 这里就记一下将apt ...