Hibernate(中)
来源:互联网 发布:php curl异步抓取 编辑:程序博客网 时间:2024/06/02 12:09
1. 集合映射
集合映射,就是指对集合属性进行映射!
需求
存储用户的地址:
班长 广州天河 深圳罗湖 北京朝阳……….
副班 广州天河 深圳罗湖
小张 深圳
一个用户,对应多个地址!
设计表存储
设计JavaBean封装数据
public class User {
private int id;
private String name;
// 集合:list/set/map/数组
private Set addressSet = new HashSet(); // hibernate生成的表,没有主键!
private List addressList = new ArrayList(); // 排序列与外键列,作为联合主键!
private Map addressMap = new HashMap();// map的key与外键列,作为联合主键!
思考:
集合的元素,能否为对象类型?
(在开发中,集合表需要主键,且要有更多的信息!)
2. 多对一与一对多映射
案例练习:
员工与部门
员工:多对一
部门:一对多
3. inverse属性
Inverse属性,
主要是在映射中,维护关联关系起作用!
Inverse,翻译为“反转”!
true 控制权反转; 当前方没有控制权!
false 不反转; 当前方有控制权!
这个属性,可以设置到一对多种,集合端!
关联关系的维护:
是否设置inverse属性,在下面操作的影响,观察?
1) 保存数据
有影响; inverse=fasle, 才可以维护关联关系!
即: 设置外键的值!
2) 通过其中一方,获取另外一方
在获取数据,没有影响!
获取数据:只要映射配置正确,关联建立好!就可以获取数据!
根控制权无关系!
3) 解除关联关系
有影响; 只有inverse=fasle,才可以解除关系!
4) 删除数据
Inverse=false; 有控制权,可以删除;
- 先清空对当前要删除数据的外键引用!
- 再删除数据!
Inverse=true 没有控制权,
1)要删除的数据,没有被外键引用,可以删除!
2)要删除的数据,有被外键引用, 不能删除!报错!
违反主外键约束!
4. 多对多映射
映射实现
举例:
老师与学员
一个老师,有多个学员! (老师与学员, 一对多)
一个学员,有多个老师! (学员与老师, 一对多!)
双向一对多,也叫多对多!
项目与软件工程师
一个项目,有多个攻城狮!
一个工程师,参与多个项目!
多对多!
需求
老师 VS 学员
关系:多对多!
设计数据库
设计JavaBean
映射
简单测试
关联关系维护
关系维护
多对多关系中,是否设置inverse属性,在下面操作的影响,观察?
1) 保存
Inverse=true 没有控制权,不会往中间表插入数据!
Invserse=false 有控制权, 会往中间表插入数据!
2) 获取
3) 解除关系
Invser=false, 可以解除关系,即删除中间表数据!
Inverse=true 没有控制权,不执行任何操作!无法解除关系!
4) 删除数据,对关系的影响!
Invser=false, 任何时候都可以删除当前数据,会自动先解除关系,再删除!
解除关系,指删除中间表数据!
Inverse=true 当删除的主键没有被引用,可以删除;
如果有被引用,删除报错!
面试题:
Inverse属性在一对多与多对多中,维护关联关系的区别?
在一对多中,inverse维护关联关系,指是否设置外键字段的值!
在多对多中, inverse维护关联关系,指是否删除中间表数据或往中间表插入数据!
5. lazy懒加载
Get & load 区别
面试题: hibenate主键查询get、load,区别?
get:
及时加载: 一执行get方法,立刻向数据库发送查询的sql
查询的主键不存在,返回null
load:
懒加载: 执行load方法时候,没有查询; 用到时候再查询!
查询主键不存在,一旦使用就报错!
Lazy 设置位置
懒加载:
类级别、属性级别、集合!
一多多、多对一、多对多!
类级别,
默认支持懒加载!
属性级别,
一多多,
Lazy 值
true 支持懒加载
false 关闭懒加载
extra 支持懒加载; 在真正使用数据的时候才向数据库发送查询的sql;
如果只是调用size()/isEmpty()方法,只会统计!
向对于设置lazy=true, 就更智能!
(只对集合属性有效!)
懒加载作用?
提升hibernate程序执行效率!
懒加载异常
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cn.itcast.f_lazy.User.addresses, no session or session was closed
结论: session关闭后,不能访问懒加载数据!
(懒加载,在用数据时候,才向数据库发送查询的sql!)
懒加载异常的解决方式:
阅读全文
0 0
- Hibernate中
- Hibernate(中)
- hibernate中 org.hibernate.MappingException
- hibernate中clob处理
- Hibernate中Query.uniqueResult();
- hibernate中clob处理
- Hibernate中配置EHCache
- Hibernate中SessionFactory配置
- HIBERNATE中级联操作
- Hibernate中检索策略
- Hibernate中使用SQLQuery
- Hibernate常见问题(不断更新中)
- hibernate中jcs详解
- jbuilder 2006中+hibernate
- Hibernate中使用SQLQuery
- hibernate 中lazy作用
- MyEclipse中使用Hibernate
- hibernate中使用sql
- 截图
- 【Python学习系列十三】Python机器学习库scikit-learn实现逻辑回归
- (1)spring初学-spring简介
- J2EE系列之SpringMVC学习笔记(六)--文件上传
- jQuery中Ajax事件beforesend及各参数含义
- Hibernate(中)
- LeetCode Recover Binary Search Tree
- 91.使用BigDecimal进行精确运算
- python opencv入门(学习笔记no.3)-从摄像头读取视频并显示
- Hibernate(下)
- Java Servlet API中文说明文档
- OGNL表达式
- 学习互联网架构第四课(volatile关键字)
- spark 内存管理