hibernate的检索策略

一.概述

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



二.类级别的检索策略

hibernate的检索策略

hibernate的检索策略

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


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

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

hibernate的检索策略



<set> 元素的 lazy 和 fetch 属性


hibernate的检索策略

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() 方法会忽略映射文件中配置的迫切左外连接检索策略, 而依旧采用延迟加载策略


小结:

hibernate的检索策略

hibernate的检索策略