返回介绍

总结

发布于 2025-01-04 01:27:29 字数 2974 浏览 0 评论 0 收藏 0

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

检索策略作用域可选检索策略默认检索策略运行时行为受影响的检索方法
类级别立即检索
延迟检索
延迟检索仅影响 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

设定批量检索的数量,可选值为一个正整数,默认值为 1。如果设定此项,合理的取值在 3-10 之间。仅适用于关联级别的立即检索和延迟检索,在和元素中包含此属性

三种检索策略比较

立即检索

  1. 优点:对应用程序完全透明,无论对象处于持久化状态还是游离状态(session 是否关闭),应用程序可以方便的从一个对象导航到与它相关的对象。
  2. 缺点:select 语句数目多,可能会加载应用程序不需要访问的对象,白白浪费内存空间。
  3. 优先考虑的场合:(1) 类级别;(2) 应用程序需要立即访问的对象; (3) 使用了二级缓存

延迟检索

  1. 优点:由应用程序决定需要加载哪些对象,可以避免执行多余的 select 语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且节省内存空间。
  2. 缺点:应用程序如果希望访问游离状态的代理类实例,必须保证它在持久化状态已经被初始化。
  3. 优先考虑的场合:(1)1-N 关联或者 N-N 关联;(2) 应用程序不需要立即访问或者根本不会访问的对象

迫切左外连接检索

  1. 优点:对应用程序完全透明,不管对象处于持久状态,还是游离状态,应用程序可以方便的从一个对象导航到与它相关的对象。
  2. 缺点:可能会加载应用程序不需要访问的对象,白白浪费内存空间; 复杂的数据库表连接也会影响检索性能。
  3. 优先考虑的场合:(1)N-1 或者 N-N 关联;(2) 应用程序需要立即访问的对象;(3) 数据库具有良好的表连接性能。

Hibernate 中会经常用到 set 等集合来表示 1-N 的关系。比如,我有 Customer 和 Order 两个对象。其中,在 Customer 中有一个 Order 的 set 集合,表示在一个顾客可以拥有多个 Order,而在 Order 对象中存在了一个 Customer 的对象,表示这个 Order 是哪个顾客下的单。这个算是比较典型的双向 1-N 关联。

这给我们带来了很大的好处,当我得到了 Customer 对象的时候,我们可以很方便的将与其相关联的 Order 集合查询出来,这也非常符合我们的实际业务,毕竟我们不可能给这个 Cutomer 对象别人的 Order 吧,这既不安全,而且对 Customer 的普通顾客来说,并无卵用。所以我们不得不说 Hibernate 的 ORM 做的很好,但凡事都有但是(要是没有但是,也就没有写这篇文章的必要了)。

我们再对数据库进行访问的时候必须要考虑性能问题(通俗点讲,就是用少发 SQL 语句),当我们设定了 1-N 这种关系后,查询过程中就有可能出现 N+1 问题。

关于 N+1 问题,并不是本文的重点。但关于 N+1 问题,我们需要知道的是,这个问题会导致 SQL 语句的增加,也就是要与数据库进行更多的交互,这无疑会给项目以及后台数据库带来影响。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文