Java软件开发基础知识梳理之(9)------Hibernate抓取策略

一、Hibernate定义的四种抓取策略
1 Join Fetching:Hibernate通过在获取主对象的SQL语句中使用Outer Join一并获取关联对象或关联集合
2 Select Fetching:另外发送一条 SELECT 语句抓取当前对象的关联实体或集合,只有当通过主对象访问关联对象或关联集合时才会发出额外的这一条SQL语句
3 Subselect Fetching:另外发送一条SELECT 语句抓取在前面查询到的所有实体对象的关联集合
4 Batch Fetching:通过指定一个主键或外键列表,Hibernate使用单条SELECT语句获取一批对象实例或集合
二、抓取时刻与关联对象的初始化
1 Immediate Fetching:加载父对象时,关联的对象、集合或属性立即被加载
2 Lazy Collection Fetching:直到应用程序对父对象的关联集合进行一次访问还加载集合中的实例(关联集合的默认加载行为)
3 "Extra-Lazy" Collection Fetching:除非真正需要,Hibernate试图避免将整个集合中的数据都加载进来,当需要访问集合中某一元素时从才DB中将它加载进来(适用于非常大的集合)
4 Proxy Fetching:当访问单值关联对象的某个方法时才加载关联对像(访问关联对象的主Id标识时不会加载关联对象)
5 No-Proxy Fetching:当访问单值关联对象的某个方法时加载关联对像(即使是访问关联对象的主Id标识也会加载关联对象)
6 Lazy Attribute Fetching:对属性或返回单值的关联而言,当其实例变量被访问的时候进行抓取(需要编译期字节码加强,较少用)
三、初始化集合与代理
1 通过父对象对关联对象或关联集合进行一次访问操作可以触发对关联对象或关联集合的初始化,如cat.getSex() or cat.getKittens().size()
2 通过Hibernate提供的Hibernate.initialize() 和 Hibernate.isInitialized()触发初始化,如Hibernate.initialize(cat)
四、三种不同的批量抓取算法(Hibernate4.2.0后新增的)
1 Legacy:这种算法通过org.hibernate.internal.util.collections.ArrayHelper#getBatchSizes保存一组预先定义好的batch-size,使用next-smaller pre-built batch size进行批量抓取
例如:预定义的batch-size数组为[20,10,9,8,7,...,3,2,1],如果batch-size定义为25
(1)如果有25个关联对象需要加载,则只需要一条SQL语句
(2)如果有24个关联对象需要加载,则需要[20,4]两组SQL语句(20和4代表发出的SQL语句中包含的父对象标识占位符的个数)
2 Padded:这种算法通过org.hibernate.internal.util.collections.ArrayHelper#getBatchSizes保存一组预先定义好的batch-size,使用next-bigger pre-built batch size进行批量抓取
(1)如果有20个关联对象需要加载,则只需要一条SQL语句
(2)如果有19个关联对象需要加载,则需要一条SQL语句,对多余的一个对象标识占位符进行填充
3 Dynamic:动态根据实际可用的父对象id数目构造SQL语句,但仍受设定的batch-size的限制
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值