文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
总结
类级别和关联级别可选的检索策略
检索策略作用域 | 可选检索策略 | 默认检索策略 | 运行时行为受影响的检索方法 |
---|---|---|---|
类级别 | 立即检索 延迟检索 | 延迟检索 | 仅影响 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 之间。仅适用于关联级别的立即检索和延迟检索,在和元素中包含此属性
三种检索策略比较
立即检索
- 优点:对应用程序完全透明,无论对象处于持久化状态还是游离状态(session 是否关闭),应用程序可以方便的从一个对象导航到与它相关的对象。
- 缺点:select 语句数目多,可能会加载应用程序不需要访问的对象,白白浪费内存空间。
- 优先考虑的场合:(1) 类级别;(2) 应用程序需要立即访问的对象; (3) 使用了二级缓存
延迟检索
- 优点:由应用程序决定需要加载哪些对象,可以避免执行多余的 select 语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且节省内存空间。
- 缺点:应用程序如果希望访问游离状态的代理类实例,必须保证它在持久化状态已经被初始化。
- 优先考虑的场合:(1)1-N 关联或者 N-N 关联;(2) 应用程序不需要立即访问或者根本不会访问的对象
迫切左外连接检索
- 优点:对应用程序完全透明,不管对象处于持久状态,还是游离状态,应用程序可以方便的从一个对象导航到与它相关的对象。
- 缺点:可能会加载应用程序不需要访问的对象,白白浪费内存空间; 复杂的数据库表连接也会影响检索性能。
- 优先考虑的场合:(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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论