Hibernate(五)---检索策略

(一)类级别的检索策略
· 类级别可选的检索策略包括立即检索和延迟检索, 默认为延迟检索;

  • 立即检索: 立即加载检索方法指定的对象;
  • 延迟检索: 延迟加载检索方法指定的对象。在使用具体的属性时,再进行加载

· 类级别的检索策略可以通过 <class> 元素的 lazy 属性进行设置;
· 无论 <class> 元素的 lazy 属性是 true 还是 false, Session 的 get() 方法及 Query 的 list() 方法在类级别总是使用立即检索策略;
· 若 <class> 元素的 lazy 属性为 true 或取默认值, Session 的 load() 方法不会执行查询数据表的 SELECT 语句, 仅返回代理类对象的实例, 该代理类实例有如下特征:

  • 由 Hibernate 在运行时采用 CGLIB 工具动态生成;
  • Hibernate 创建代理类实例时, 仅初始化其 OID 属性;
  • 在应用程序第一次访问代理类实例的非 OID 属性时, Hibernate 会初始化代理类实例;
    (二) 一对多和多对多的检索策略
    I 在映射文件中, 用 <set> 元素来配置一对多关联及多对多关联关系. <set> 元素有 lazy 和 fetch 属性:
    (1)lazy属性:主要决定 orders 集合被初始化的时机. 即到底是在加载 Customer 对象时就被初始化, 还是在程序访问 orders 集合时被初始化
  • ①. 1-n 或 n-n 的集合属性默认使用懒加载检索策略
  • ②. 可以通过设置 set 的 lazy 属性来修改默认的检索策略. 默认为 true 并不建议设置为 false.
  • ③. lazy 还可以设置为 extra. 增强的延迟检索. 该取值会尽可能的延迟集合初始化的时机!
    注:特别说明延迟检索和增强延迟检索
    这里写图片描述
    (2)set 元素的 batch-size 属性: 设定一次初始化 set 集合的数量.
    (3)set 集合的 fetch 属性: 确定初始化 orders 集合的方式.

  • .默认值为 select. 通过正常的方式来初始化 set 元素.

  • 可以取值为 subselect. 通过子查询的方式来初始化所有的 set 集合. 子查询作为 where 子句的 in 的条件出现, 子查询查询所有 1 的一端的 ID. 此时 lazy 有效.但 batch-size 失效.

  • 若取值为 join. 则在加载 1 的一端的对象时, 使用迫切左外连接(使用左外链接进行查询, 且把集合属性进行初始化)的方式检索 n 的一端的集合属性,忽略 lazy 属性.HQL 查询忽略 fetch=join的取值(即会忽略映射文件中配置的迫切左外连接检索策略),而依旧采用延迟加载策略.

总结:<set> 元素的 lazy 和 fetch 属性
这里写图片描述

II <many-to-one> 元素中的 lazy 属性和 fetch 属性.
这里写图片描述
注:
①若 fetch 属性设为 join, 那么 lazy 属性被忽略
②迫切左外连接检索策略的优点在于比立即检索策略使用的 SELECT 语句更少.
③无代理延迟检索需要增强持久化类的字节码才能实现
(三)检索策略小结
· 类级别和关联级别可选的检索策略及默认的检索策略
这里写图片描述
· 3 种检索策略的运行机制
这里写图片描述
· 映射文件中用于设定检索策略的几个属性
这里写图片描述
· 比较 Hibernate 的三种检索策略
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值