集册 Hibernate 高级教程 Hibernate:检索策略的学习2

Hibernate:检索策略的学习2

—— 概述

欢马劈雪     最近更新时间:2020-08-04 05:37:59

467

本文是在进行Hibernate检索策略学习过程中所总结的知识点的第二部分。其中在第一部分中,已经学习了类级别的检索策略以及1-N和N-N的检索策略。在该文中将学习N-1和1-1的检索策略,并对检索策略进行总结。

Hibernate:检索策略的学习1 Hibernate:检索策略的学习2

N-1和1-1的检索策略


这个小节中的内容其实与第二部分的关于1-N和N-N部分有很多相似之处。只不过操作的对象不一样。比如说,我们之前考虑的是在获得了Customer时,如何获取其对应的orders集合;而在该节,我们考虑的是,在获取了Order对象,如何获取相对应的Customer。

在这里,我们需要考虑的是在Order.hbm.xml中的标签的属性,同样,其也有lazy属性和fetch属性:

lazy属性(默认值proxy) fetch属性(默认值select) 检索Order对象时对关联的Customer对象使用的检索策略
proxy 未设置(取默认值select) 采用延迟检索策略
no-proxy 未设置(取默认值select) 无代理延迟检索策略
false 未设置(取默认值select) 立即检索
proxy join 迫切左外连接检索

需要注意的点:

  • 若fetch属性设置为join,那么lazy属性将被忽略;
  • 迫切左外连接检索策略的优点在于比立即检索策略使用的SELECT语句更少;
  • no-proxy延迟检索需要增强持久化类的字节码才能实现。
  • Query的list方法会忽略映射文件配置的迫切左外连接检索策略(join),而采用延迟检索策略。

如果在关联级别使用了延迟加载或立即加载检索策略,可以设定批量检索的大小,以帮助提高延迟检索或立即检索的运行性能。该属性需要设置在 1 那一的 class 元素中,也就是Customer的元素:<class name="Customer" table="CUSTOMERS" lazy="true" batch-size="5">。其作用可以批量的初始化Customer对象。

总结


类级别和关联级别可选的检索策略

检索策略作用域 可选检索策略 默认检索策略 运行时行为受影响的检索方法
类级别 立即检索
延迟检索
延迟检索 仅影响Session的load()方法
关联级别 立即检索
延迟检索
迫切左外连接检索
延迟检索 影响Session的load()方法和get()方法,以及Query API和Criteria
API,例外情况是Query API会忽略迫切左外连接策略

3种检索策略的运行机制

检索策略类型 类级别 关联级别
立即检索 立即加载检索方法指定的对象 立即加载与检索方法指定的对象的关联对象,可以设定批量检索数量
延迟检索 延迟加载检索方法指定的对象 延迟加载与检索方式指定的对象的关联对象,可以设定批量检索数量
迫切左外连接 不适用 通过左外连接加载与检索方法指定的对象的关联对象

设定检索策略的属性

lazy

  • 类级别
    • 元素中lazy属性的可选值为true(延迟检索)和false(立即检索)
    • 元素的lazy属性默认为true
  • 1-N和N-N关联级别
    • 元素中lazy属性的可选值为true(延迟检索)和false(立即检索)
    • 元素的lazy属性默认为true
  • 多对多关联级别
    • 元素中lazy属性的可选值为proxy(延迟检索)、no-proxy(无代理延迟检索)和false(立即检索)
    • 元素的lazy属性默认为proxy

fetch

  • 类级别
    • 没有此属性
  • 1-N和N-N关联级别
    • 元素中fetch属性的可选值为select(select查询语句)、subselect(带子查询的select语句)和join(迫切左外连接检索)
    • 元素的fetch属性默认为select
  • N-1和1-1关联级别
    • 元素中fetch属性的可选值为select(select查询语句)和join(迫切左外连接检索)
    • 元素的fetch属性默认为select

batch-size

展开阅读全文