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!)

懒加载异常的解决方式: