[TOC]
# 简介
一个对象就对应着表中的一条记录,而表中的字段对应着类中的属性。
数据库中表与表之间存在着三种关系,也就是系统设计中的三种实体关系
## 一对一
原则有两种:
1. 1. 唯一外键对应:在任意一方添加外键来描述对应关系
2. 2. 主键对应:一方的主键作为另一方的主键
![](https://box.kancloud.cn/4fe81fa7df0d93110215b9bc819354ca_869x483.png)
~~~
Class Employee{
Private Archives archives;
}
Class Archives{
Private Employee employee;
}
~~~
## 一对多,多对一
客户与订单之间一对多关系(多对一)
建表原则:在多的一方添加外键来描述关联关系
![](https://box.kancloud.cn/45b290a339f5c7e52e2820ec7d0c0597_1072x413.png)
~~~
Class Customer{
Private Set<Order> orders;
}
Class Order{
Private Customer c;
}
~~~
## 多对多
例如学生与老师
建表原则:通过一张中间表来描述其对应关系
![](https://box.kancloud.cn/b22bdee598922f0ce3e2713fa37b8a4a_1072x630.png)
~~~
Class Student{
Set<Teacher> ts;
}
Class Teacher{
Set<Student> ss;
}
~~~
# Hibernate关系映射--(一对多,多对一)
类创建
订单
![](https://box.kancloud.cn/5443e5b3c24b6083b368ea4c790bce42_781x328.png)
客户
![](https://box.kancloud.cn/3dac21bf3adb871e20f224e53eb946fd_992x325.png)
映射文件编写
Order.hbm.xml
![](https://box.kancloud.cn/573095c6a4616a1de7ecf4fdf7df6385_1114x241.png)
Customer.hbm.xml
![](https://box.kancloud.cn/e03d0b62f9a7e9006cc842adb8dca0d9_1068x438.png)
## 测试保存
![](https://box.kancloud.cn/12e8c5b996c2de3c55fd20a1cc349d4e_426x452.png)
上面操作是一种双向关联
问题:我们可不可以只保存订单或只保存客户完成保存操作?
## 测试单向关联保存
![](https://box.kancloud.cn/6efdec2a3f6ce882f20ffa6f568912a4_1152x422.png)
这个异常代表提一个持久化对象关联了一个瞬时对象。
我们可以使用级联操作来解决上述的问题.
我们现在要做的是保存订单时保存客户,需要在订单的hbm配置文件中修改
![](https://box.kancloud.cn/18a906cdd3d11e64915f7087b0cc6d37_1117x457.png)
## 双向关联维护
我们在开发中要配置双向关联配置。---------可以通过任意一方来操作对方
在操作代码,尽量来要进行单向关联。------可以尽量资源浪费。
在双向关联中,会存在多余的update语句。
我们可以使用inverse属性来设置,双向关联时由哪一方来维护表与表之间的关系。
![](https://box.kancloud.cn/2bd4e6bc63c278a1808b5ade425b848e_1023x405.png)
# 级联删除
我们在删除客户时,也要删除订单,如果没有做级联,那么这个操作是不允许。
为了维护数据完整性
![](https://box.kancloud.cn/d5316bc644a655ef43158cee108f5e51_1109x124.png)
想要完成操作:我们可以在客户中添加`cascade=”delete”;`
![](https://box.kancloud.cn/3d3e49e59278d1a2f9d416ff94a7fb74_1058x649.png)
![](https://box.kancloud.cn/8f1b061555269cb4f0508ca5e83b0bc3_1081x207.png)
# cascade总结
使用cascade可以完成级联操作
它可常用取值:
none这是一个默认值
save-update,当我们配置它时,底层使用save update或save-update完成操作,级联保存临时对象,如果是游离对象,会执行update.
delete 级联删除
delete-ophan 删除与当前对象解除关系的对象。
all 它包含了save-update delete操作
all-delete-orphan 它包信了delete-orphan与all操作
# cascade与inverse有什么区别?
cascade它是完成级联操作
Inverse它只有在双向关联情况下有作用,它来指定由哪一方维护外键
# 多对多
我们使用注解完成多对多配置.
描述学生与老师.
使用@ManyToMany来配置多对多,只需要在一端配置中间表,另一端使用mappedBy表示放置外键维护权。
创建PO类
Teacher类中
![](https://box.kancloud.cn/0af673d69a71175a264b0e6d4152af0f_774x517.png)
## 级联保存操作测试
因为我们将外键的维护权利由Student来维护,我们演示保存学生时,将都也级联保存。
![](https://box.kancloud.cn/1784fac6fb33136c6ff57973000e9efe_788x463.png)
# 一对一
以人与身份证号为例
一对一操作有两种映射方式:
1. 1. 在任意一方添加外键
2. 2. 主键映射
## 外键映射
创建实体
User类
![](https://box.kancloud.cn/9b20ea2a4ec598f4c2d6d866d9632c8d_748x287.png)
上述配置,t_user表放弃对外键的维护权利
IDCard类
![](https://box.kancloud.cn/135499cb3af4a00307d94db458d6ceb4_742x875.png)
- 基础
- 编译和安装
- scanner类(键盘录入)
- Random类(随机数)
- 数组
- 方法
- 类
- ArrayList集合
- char与int
- eclipse
- IDEA
- 变量与常量
- 常用API
- String,StringBuffer,StringBuilder
- 正则,Date,DateFormat,Calendar
- 包装类,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增强for,泛型
- List,set,判断集合唯一
- map,Entry,HashMap,Collections
- 异常
- IO
- File
- 递归
- 字节流
- 字符流
- IO流分类
- 转换流
- 缓冲流
- 流的操作规律
- properties
- 序列化流与反序列化流
- 打印流
- commons-IO
- IO流总结
- 多线程
- 线程池
- 线程安全
- 线程同步
- 死锁
- lock接口
- ThreadLoad
- 等待唤醒机制
- 线程状态
- jdbc
- DBUtils
- 连接池DBCP
- c3p0连接池
- 网络编程
- 多线程socket上传图片
- 反射
- xml
- 设计模式
- 装饰器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事务
- 监听器Listener
- 过滤器Filter
- json
- linux安装软件
- 反射详解
- 类加载器和注解
- 动态代理
- jedis
- Hibernate
- 简介
- 创建映射文件
- Hibernate核心配置文件
- 事务和增删改查
- HibernateUtils
- 持久化对象的三种状态
- 检索方式
- query
- Criteria
- SQLQuery
- 持久化类
- 主键生成策略
- 缓存
- 事务管理
- 关系映射
- 注解
- 优化
- struts2
- 搭建
- 配置详解
- Action
- 结果跳转方式
- 访问ServletAPI方式
- 如何获得参数
- OGNL表达式
- valueStack 值栈
- Interceptor拦截器
- spring
- 导包
- IOC和DI
- Bean获取与实例化
- Bean属性注入
- spring注解
- 注解分层
- junit整合
- aop
- 动态代理实现
- cglib代理实现
- aop名词
- spring的aop
- aop-xml详解
- aop-注解详解
- 代理方式选择
- jdbcTemplate
- spring事务管理
- 回滚注意
- 事务传播属性
- MyBatis
- MyBatis简介
- 入门程序
- 与jdbc hibernate不同
- 原始Dao开发
- Mapper动态代理方式
- SqlMapConfig.xml配置文件
- 输入参数pojo包装类
- resultMap
- 动态sql
- 一对一关联
- 一对多
- 整合spring
- 逆向工程
- maven
- maven简介
- 仓库
- maven目录结构
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入门程序
- 整合struct
- 依赖范围
- 添加插件
- idea配置
- jar包冲突
- 分模块开发
- 构建可执行的jar包(包含依赖jar包)
- springMVC
- 处理流程
- java面试
- java版本升级
- java1-8版本变更
- java9新特性
- 锁
- java资料
- idea
- jdk版本切换
- log4j
- 入门实例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代码优化