1.概述

检索数据时的2个问题:

  • 不浪费内存:当Hibernate从数据库中加载Customer对象时,如果同时加载所有关联的Order对象,而程序仅仅需要访问Customer对象,那么关联的Order对象就白白浪费了许多内存

  • 更高的查询效率:发送尽可能少的SQL语句

2.类级别的检索策略

  • 包括立即检索和延迟检索,默认为延迟检索

    • 立即检索:立即加载检索方法指定的对象

    • 延迟检索:延迟加载检索方法指定的对象

  • 类级别的检索策略可以通过<class>元素的lazy属性进行设置

    • 如果程序加载一个对象的目的是为了访问它的属性,可以采取立即检索

    • 如果仅仅是为了获得它的引用,可以采用延迟索引

  • 无论<class>元素的lazy属性是true还是false,Session的get()方法和Query的list()方法在类级别总是使用立即检索策略

<class name="Order" table="ORDERS" lazy="true">具体内容省略...</class>

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

  • 在映射文件中,用<set>元素来配置一对多关联及多对多管理关系。<set>元素有lazy和fetch属性

    • lazy:主要决定orders集合被初始化的实际

    • fetch:取值为“select”或“subselect”时,决定初始化orders的查询语句的形式;若取值为“join”,则决定orders集合被初始化的时机

    • 若把fetch设置为“join”,lazy属性将被忽略

    • <set>元素的batch-size属性:用来为延迟检索策略或理解检索策略设定批量检索的数量

lazy属性(默认:true) fetch(默认:select) 检索策略
true select 延迟检索
false select 立即检索
extra select 加强延迟检索
true,false或extra select select查询:select * from orders where customer_id in(1,2,3,4)
true,false或extra subselect 子查询:select * from orders where customer_id in(select id from customers)
true join 采用迫切左外连接策略

(1)延迟检索

  • Hibernate在以下情况下初始化集合代理类实例

    • 应用程序第一次访问集合属性,iterator(),size(),isEmpty(),contains()等方法

    • 通过Hibernate.initialize()静态方法显式初始化

(2)增强延迟检索

  • 进一步延迟Customer对象的Orders集合代理实例的初始化时机

    • 当程序第一次访问orders属性的iterator()方法,会导致orders集合代理类实例的初始化

    • 当程序第一次访问order属性的size(),contains()和isEmpty()方法时,Hibernate不会初始化orders集合类的实例,仅通过特定的select语句查询必要的信息。比如:select count(*) from order where 条件

(3)<set>元素的batch-size属性

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

若batch-size设置为3,有5条数据
select * from order where customer_id in(1,2,3)
select * from order where customer_id in(4,5)

(4)迫切左外连接

  • 检索Customer对象时,会采用迫切左外连接(通过左外连接加载与检索指定的对象关联的对象)策略来检索所有关联的Order对象

  • lazy属性将被忽略

  • Query的list()方法会忽略映射文件中配合的迫切左外连接策略,依旧采用延迟加载策略

    @Testpublic void testSetFetch2(){Customer customer = (Customer) session.get(Customer.class, 1);System.out.println(customer.getOrders().size()); }
​
​@Testpublic void testSetFetch(){//1. 若取值为 join. 则//1.1 在加载 1 的一端的对象时, 使用迫切左外连接(使用左外链接进行查询, 且把集合属性进行初始化)的方式检索 n 的一端的集合属性//1.2 忽略 lazy 属性.//1.3 HQL 查询忽略 fetch=join 的取值List<Customer> customers = session.createQuery("FROM Customer").list();System.out.println(customers.size()); for(Customer customer: customers){if(customer.getOrders() != null)System.out.println(customer.getOrders().size());}}

4.多对一的检索策略

  • <many-to-one>元素也有一个lazy属性和fetch属性

    • 若fetch属性为join,那么lazy属性将被忽略

    • 无代理延迟检索需要增强持久化类的字节码才能实现

lazy属性(默认:proxy) fetch属性(默认:select) 检索策略
proxy select 延迟检索
no-proxy select 无代理延迟检索
false select 立即检索
proxy join 迫切左外连接
<hibernate-mapping package="com.yfy.hibernate.strategy">
​<class name="Order" table="ORDERS">
​<id name="orderId" type="java.lang.Integer"><column name="ORDER_ID" /><generator class="native" /></id><property name="orderName" type="java.lang.String"><column name="ORDER_NAME" /></property><many-to-one name="customer" class="Customer" column="CUSTOMER_ID"lazy="false"fetch="join"></many-to-one>
​</class>
</hibernate-mapping>
public class Customer {
​private Integer customerId;private String customerName;private Set<Order> orders = new HashSet<>();
}

Hibernate之检索策略相关推荐

  1. Hibernate的检索策略

    Hibernate的Session在加载一个Java对象时,可以将与这个对象相关联的其他Java对象都加载到缓存中,以便程序及时调用.但有些情况下,我们不需要加载太多无用的对象到缓存中,一来这样会撑爆 ...

  2. Hibernate框架--学习笔记(下):hibernate的查询方式、多表查询、检索策略、批量抓取

    一.hibernate的查询方式: 主要有五种:对象导航查询:OID查询:hql查询:QBC查询:本地sql查询. 1.对象导航查询:根据id查询某个客户,再查询这个客户里面所有的联系人. 2.OID ...

  3. hibernate 插入 效率_Hibernate:检索策略的学习1

    概述 检索数据,也就是查询数据是在一个系统中必不可少的一个功能.检索数据时的2个问题: 不浪费内存:例如,Customer和Order是双向1-N的关系.当 Hibernate 从数据库中加载 Cus ...

  4. (九)Hibernate 检索策略

    所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 这里的hibernate.cfg.xml配置信息我就不再写了 第一节:检 ...

  5. 10、Hibernate的对象检索策略

    - 立即检索策略 - 延迟检索策略 - 左外连接检索策略 - 每种检索策略的适用范围 - 在程序中显式指定左外连接检索策略 表字段之间的对应关系 1.运行Session的方法 List custome ...

  6. Hibernate的三种检索策略

    1 N+1问题 Hibernate的Session缓存中存放的是相互关联的对象图,默认情况下,当从数据库中加载一个对象的时候,会同时加载它所关联的其他对象.例如:Clazz(班级)跟Student(学 ...

  7. JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题

    Hibernate的检索方式  Hibernate提供了以下几种检索对象的方式: 导航对象图检索方式:根据已经加载的对象导航到其他对象. OID检索方式:按照对象的OID来检索对象. HQL检索方式: ...

  8. Hibernate学习(八)———— Hibernate检索策略(类级别,关联级别,批量检索)详解...

    序言 很多看起来很难的东西其实并不难,关键是看自己是否花费了时间和精力去看,如果一个东西你能看得懂,同样的,别人也能看得懂,体现不出和别人的差距,所以当你觉得自己看了很多书或者学了很多东西的时候,你要 ...

  9. Hibernate之检索方式(HQL/QBC/本地SQL)

    一.概述 Hibernate提供了以下几种检索对象的方式 导航对象图:根据已经加载的对象导航到其它对象 OID:按照对象的OID来检索对象 HQL:使用面向对象的HQL查询语句 QBC:使用QBC(Q ...

最新文章

  1. 对于Chua 混沌电路进一步测试
  2. 图像转置的MATLAB和OpenCV源码
  3. [学习笔记]03.字符串的扩展
  4. php的exportexcel,PHPExcel export网络或本地图片到excel
  5. 深度解析windows调试技术之一 [抓取user mode dump文件的几重境界]
  6. 高性能Web动画和渲染原理系列(2)——渲染管线和CPU渲染
  7. 一个apache安装后无法启动的原因分析
  8. 现有产品的三种发展战略
  9. 使用JavaParser进行java源码解析
  10. shell初学之PHP
  11. 一层交换 二层交换 三层交换 四层交换 七层交换 OSI参考模型
  12. 一分钟快速了解内网穿透软件有哪些
  13. pdf不预览直接打印(笔记记录)
  14. wifi分析仪是什么?
  15. 解决git fatal:无法找到‘https‘的远程助手
  16. Shiro解决多个二级域名的单点登录问题
  17. Fast Reed-Solomon Interactive Oracle Proofs of Proximity学习笔记
  18. PAT 乙级 1040 有几个PAT (25分)
  19. 视频讲解Agora视频通话SDK| 掘金技术征文
  20. 中等职业学校计算机课程标准,全市中等职业学校信息技术课程标准内涵解析与教学设计培训会议成功举办...

热门文章

  1. python操作mysql操作步骤
  2. python——常用内置函数(enumerate、map、zip、eval)用法
  3. 图片爬取数据解析数据持久化
  4. (49)逆向分析KiSystemService/KiFastCallEntry调用内核函数部分(SST,SSDT,SSPT)
  5. 树莓派3开wifi热点
  6. 2017年CISCN初赛
  7. 6、mysqldump备份数据库(附带实例)
  8. 1.6 为什么使用向上转型而不直接创建子类对象?
  9. ACM入门之【二分】
  10. Acwing第 2 场周赛【完结】