今天总结的是hibernate 的多对多操作,还有继承映射和加载策略,话不多说,直接进入正题
多对多:多对多分为单向多对多和双向多对多,但是只要会写单向的,多向的无非是再多做一次单向的,所以先从单向的开始
首先了解单向多对多的是怎么链接的,他们是通过中间一个表,向一家三口,孩子在中间那样,小手拉大手链接起来两个表
创建两个个实体类Student 和Teacher,莫要忘记实例化
然后配置Teacher.hbm.xml
配置Student.hbm.xml,这里不需要多做什么
在做多对多的时候,发现一个问题,就是当你测试的时候会报错,错误是序列化不存在,但是当我把Hibernate的配置文件剪切复制一遍的时候,就能正常运行了
接下来介绍继承映射,在这里仅仅介绍继承映射的一张表操作:
特点:查询效率高,但是 有冗余
首先编写Employee类,HourlyEmployee和SalaryEmployee继承Employee
继承映射的话只需编写继承类的.hbm.xml 文件
接下来是检索策略的总结:首先顾名思义检索策略就是在取数据的时候用到的,比如get,load,Query等
为什么要用检索策略?1.减少session一级缓存的浪费 2.减少SQL语句,提高效率
策略的分级:
类级别的检索策略:仅影响Session的load()方法
Session.get() 立即检索
Session.createQuert().list() 立即检索
Session.load() 延迟加载,返回的是代理的对象,只有oid, 减少Session一级缓存的浪费 由lazy来控制,默认是true
建立关系的时候使用类级别的延迟加载
关联级别的检索策略:
立即检索(立即加载)
延迟检索(延迟加载)默认
迫切做外链接(lazy batch-size 影响不到)
影响Session 的load get以及Query(HQL的检索方式)
当get,load.Query含有关联对象的时候不仅是查出所需要的对象,还有关联的对象默认查出,所以才用到关联级别的检索策略。在<Set>中配置lazy和fetch 和batch-size
lazy:决定关联对象的加载的时机
true 懒加载,false 立即加载,extra增强延迟,用到什么初始化什么
fetch:决定查询关联对象所采用的语句
默认select由多条sql语句组成,substring 子查询,join做连接多表查询此时的lazy失效
hibernate提供的5中检索方式:
1.OID检索:根据get,load检索
2.对象检索:根据对象get方法
3.HQL检索:Query
4.QBC检索:面向多个and
5.本地SQl检索:速度快,但是不适合hibernate 原生的JDBC+SQL