hibernate的检索策略

一.概述

  检索数据时的 2 个问题:
不浪费内存:当 Hibernate 从数据库中加载 Customer 对象时, 如果同时加载所有关联的 Order 对象, 而程序实际上仅仅需要访问 Customer 对象, 那么这些关联的 Order 对象就白白浪费了许多内存.
更高的查询效率发送尽可能少的 SQL 语句



二.类级别的检索策略





简单来说:当我们用load的时候,当我们用具体的属性时候,才进行加载.但是我们可以设置lazy=false
进行立即检索
 <class name="Order" table="ORDERS" lazy="false">


三.一对多和多对多的检索策略

注:多对一,一对一在class里设置




<set> 元素的 lazy 和 fetch 属性



true的延迟检索策略与extra的加强检索策略的区别

在延迟检索(lazy 属性值为 true) 集合属性时, Hibernate 在以下情况下初始化集合代理类实例 
应用程序第一次访问集合属性: iterator(), size(), isEmpty(), contains() 等方法
通过 Hibernate.initialize() 静态方法显式初始化
增强延迟检索(lazy 属性为 extra): 与 lazy=“true” 类似. 主要区别是增强延迟检索策略能进一步延迟 Customer 对象的 orders 集合代理实例的初始化时机:
当程序第一次访问 orders 属性的 iterator() 方法时, 会导致 orders 集合代理类实例的初始化
当程序第一次访问 order 属性的 size(), contains() 和 isEmpty() 方法时, Hibernate 不会初始化 orders 集合类的实例, 仅通过特定的 select 语句查询必要的信息, 不会检索所有的 Order 对象


<set> 元素的 batch-size 属性
<set> 元素有一个 batch-size 属性, 用来为延迟检索策略或立即检索策略设定批量检索的数量. 批量检索能减少 SELECT 语句的数目, 提高延迟检索或立即检索的运行性能. 

fetch属性

1.默认为select属性,通过正常的方式来初始化set

2.如果设置成subselect,则采取子查询的形式来初始化order集合,所以这个时候batch-size设置无效,因为它一次性初始了所有,然后用in 匹配.但是lazy属性还是有效的

3.如果设置成join 检索 Customer 对象时, 会采用迫切左外连接且把集合进行初始化(通过左外连接加载与检索指定的对象关联的对象)策略来检索所有关联的 Order 对象
lazy 属性将被忽略
Query 的list() 方法会忽略映射文件中配置的迫切左外连接检索策略, 而依旧采用延迟加载策略


小结:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值