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访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复 ...
随机推荐
- 4、加载:Loading
/* ---html----*/ <ion-content> <button (click)="manual()">手动关闭</button> ...
- 成长之路--Docker入门
简介 Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机. Docker版本 Docker 划分为CE 和EE.CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使 ...
- PAT 1055 The World's Richest
#include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #i ...
- 跨平台移动开发_PhoneGap 再次点击返回键切换到桌面效果
PhoneGap 再次点击返回键切换到桌面效果 相关代码 <!DOCTYPE html> <html> <head> <title> PhoneGap ...
- 开发Windows RT平台下的Windows应用商店应用程序的遇到的问题备忘
1. 关于获取Win8开发者许可证的问题: 有一种情况是:如果系统是Win8.0, 那么如果先激活了windows8(用激活工具), 再安装VS2012,那么在新建项目时会提示获取windows8开发 ...
- PowerDesigner 连接数据库(以MySQL)为例
- SVNKit学习——使用High-Level API管理Working Copy示例(六)
本篇内容是基于SVNKit High-Level API实现的针对Working copy的操作,操作内容与SVN图形化界面.命令行类似. High-Level API类图: 核心思想: 所有操作由各 ...
- Java—集合框架Map
Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,key和value可以是任意类型的对象,能够实现根据key快速查找value. Map中的键值对以Entr ...
- 利用SQL Server Management Studio(SSMS)复制数据库
利用SQL Server Management Studio(SSMS)复制数据库 标签(空格分隔): SQLServer 前言 今天由于客户购买的软件版本确认了,而之前进行开发的本地数据库版本较低, ...
- JavaScript中弧度和角度的转换
弧度 = 角度 * Math.PI / 180 角度 = 弧度 * 180 / Math.PI 在JavaScript Math 对象中: sin() 方法可返回一个数字的正弦. tan() 方法可返 ...