- 浏览: 413948 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
skying007:
...
Mysql coalesce() 函数认识和用法 -
kchiu:
关于这个心跳的发送和接收 晚上全是the fuccking s ...
socket心跳检测 -
bjsq618:
你的想法在大的物流公司已经实现了,只不过他们使用是GPS定位
ddd -
jiaguwen123:
2,AuthenticationHandler类的写法
pa ...
xfire客户端 -
sornor:
总结的不错哟!
Java中的函数yield(),sleep()和wait()的区别
-
Hibernate抓取策略(fetching strategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略。
本文主要就Hibernate抓取策略加以分析,Hibernate抓取策略(fetching strategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略。
抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL 或条件查询(Criteria Query)中重载声明。
如下几种Hibernate抓取策略:
◆连接抓取(Join fetching) - Hibernate通过 在SELECT语句使用OUTER JOIN(外连接)来 获得对象的关联实例或者关联集合。
◆查询抓取(Select fetching) - 另外发送一条 SELECT 语句抓取当前对象的关联实体或集合。除非你显式的指定lazy="false"禁止 延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。
◆子查询抓取(Subselect fetching) - 另外发送一条SELECT 语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显式的指定lazy="false" 禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。
◆批量抓取(Batch fetching) - 对查询抓取的优化方案, 通过指定一个主键或外键列表,Hibernate使用单条SELECT语句获取一批对象实例或集合。
Hibernate抓取策略会区分下列各种情况:
1.Immediate fetching,立即抓取 - 当宿主被加载时,关联、集合或属性被立即抓取。
2.Lazy collection fetching,延迟集合抓取- 直到应用程序对集合进行了一次操作时,集合才被抓取。(对集合而言这是默认行为。)
3."Extra-lazy" collection fetching,"Extra-lazy"集合抓取 -对集合类中的每个元素而言,都是直到需要时才去访问数据库。除非绝对必要,Hibernate不会试图去把整个集合都抓取到内存里来(适用于非常大的集合)。
4.Proxy fetching,代理抓取 - 对返回单值的关联而言,当其某个方法被调用,而非对其关键字进行get操作时才抓取。
5."No-proxy" fetching,非代理抓取 - 对返回单值的关联而言,当实例变量被访问的时候进行抓取。与上面的代理抓取相比,这种方法没有那么“延迟”得厉害(就算只访问标识符,也会导致关联抓取)但是更加透明,因为对应用程序来说,不再看到proxy。这种方法需要在编译期间进行字节码增强操作,因此很少需要用到。
6.Lazy attribute fetching,属性延迟加载 - 对属性或返回单值的关联而言,当其实例变量被访问的时候进行抓取。需要编译期字节码强化,因此这一方法很少是必要的。
这里有两个正交的概念:关联何时被抓取,以及被如何抓取(会采用什么样的SQL语句)。不要混淆它们!我们使用抓取来改善性能。我们使用延迟来定义一些契约,对某特定类的某个脱管的实例,知道有哪些数据是可以使用的。
1.操作延迟加载的关联
默认情况下,Hibernate 3对集合使用延迟select抓取,对返回单值的关联使用延迟代理抓取。对几乎是所有的应用而言,其绝大多数的关联,这种策略都是有效的。
注意:假若你设置了hibernate.default_batch_fetch_size,Hibernate会对延迟加载采取批量抓取优化措施(这种优化也可能会在更细化的级别打开)。
然而,你必须了解延迟抓取带来的一个问题。在一个打开的Hibernate session上下文之外调用延迟集合会导致一次意外。比如:
- s = sessions.openSession();
- Transaction tx = s.beginTransaction();
- User u = (User) s.createQuery("from User u where u.name=:userName")
- .setString("userName", userName).uniqueResult();
- Map permissions = u.getPermissions();
- tx.commit();
- s.close();
- Integer accessLevel = (Integer) permissions.get("accounts"); // Error!
在Session关闭后,permessions集合将是未实例化的、不再可用,因此无法正常载入其状态。 Hibernate对脱管对象不支持延迟实例化. 这里的修改方法是:将permissions读取数据的代码 移到tx.commit()之前。
除此之外,通过对关联映射指定lazy="false",我们也可以使用非延迟的集合或关联。但是, 对绝大部分集合来说,更推荐使用延迟方式抓取数据。如果在你的对象模型中定义了太多的非延迟关联,Hibernate最终几乎需要在每个事务中载入整个数据库到内存中!
但是,另一方面,在一些特殊的事务中,我们也经常需要使用到连接抓取(它本身上就是非延迟的),以代替查询抓取。 下面我们将会很快明白如何具体的定制Hibernate中的抓取策略。在Hibernate3中,具体选择哪种抓取策略的机制是和选择 单值关联或集合关联相一致的。
2. 调整抓取策略(Tuning fetch strategies)
查询抓取(默认的)在N+1查询的情况下是极其脆弱的,因此我们可能会要求在映射文档中定义使用连接抓取:
- <set name="permissions"
- fetch="join">
- <key column="userId"/>
- <one-to-many class="Permission"/>
- set
- <many-to-one name="mother" class="Cat" fetch="join"/>
在映射文档中定义的抓取策略将会对以下列表条目产生影响:通过get()或load()方法取得数据。只有在关联之间进行导航时,才会隐式的取得数据。
条件查询,使用了subselect抓取的HQL查询
不管你使用哪种抓取策略,定义为非延迟的类图会被保证一定装载入内存。注意这可能意味着在一条HQL查询后紧跟着一系列的查询。
通常情况下,我们并不使用映射文档进行抓取策略的定制。更多的是,保持其默认值,然后在特定的事务中, 使用HQL的左连接抓取(left join fetch) 对其进行重载。这将通知 Hibernate在第一次查询中使用外部关联(outer join),直接得到其关联数据。 在条件查询 API中,应该调用 setFetchMode(FetchMode.JOIN)语句。
也许你喜欢仅仅通过条件查询,就可以改变get() 或 load()语句中的数据抓取策略。例如:
- User user = (User) session.createCriteria(User.class)
- .setFetchMode("permissions", FetchMode.JOIN)
- .add( Restrictions.idEq(userId) )
- .uniqueResult();
(这就是其他ORM解决方案的“抓取计划(fetch plan)”在Hibernate中的等价物。)截然不同的一种避免N+1次查询的方法是,使用二级缓存。
发表评论
-
入门 05 - Query接口
2012-09-05 08:13 1652入门 05 - Query接口 我 ... -
Hibernate 5种查询方式代码示例
2011-08-13 09:52 1707package com.cstp.hibernate; im ... -
Java Hibernate Criteria 用法
2010-11-07 23:43 508315.1. 创建一个Criteria 实例org.hibern ... -
hibernate技巧 封装查询结果
2010-11-07 23:30 1252hibernate技巧 封装查询结果 将hibernate 查 ... -
hibernate调用数据库自定义函数
2010-10-31 17:31 1726本文使用的是Oracle9i数据库,hibernate3.0, ... -
HibernateTemplate 的 find方法使用
2010-10-27 22:04 2298一、find(String queryString); ... -
hibernate分组查询
2010-10-26 21:54 1644private static final Str ... -
Hibernate Criteria
2010-10-10 21:58 991Hibernate QBC查询 QBC查询: ... -
Hibernate3的DetachedCriteria支持
2010-10-10 08:42 914Hibernate3支持DetachedCriteria,这是 ... -
hibernate 中对象操作中evict方法和clear方法的区别
2010-09-14 10:11 1265session.evict(obj),会把指定的缓冲对象进行清 ... -
Hibernate三种状态的区分
2010-09-14 10:02 964Hibernate的对象有3种状态,分别为:瞬时态(Trans ... -
hibernate查询多对多数据范例
2010-09-03 16:38 1070public class StuDao<T> ex ... -
hibernate生成数据库表
2010-08-19 08:22 4141import org.hibernate.cfg.Config ... -
hibernate二级缓存
2010-08-19 07:56 1116二级缓存也称进程级的缓存或SessionFactory级的缓存 ... -
hibernate一级缓存
2010-08-18 23:11 1259一级缓存很短和session的生命周期一致,一级缓存也叫ses ... -
hibernate向MYSQL插入数据的乱码问题
2010-08-17 21:55 1284向数据库插入数据的时候出现乱码,解决办法: 一、数据库连接串 ... -
composite-id 学习
2010-08-15 17:10 1296组件作为联合标识符,必须满足: 它必须实现java.io.Se ... -
hibernate存储过程调用
2010-08-12 17:28 1603听说Hibenate3可以在执行 ... -
Hibernate对视图的操作
2010-08-12 17:08 1261Hibernate对视图进行操作时和对普通的表有些不同,下面就 ... -
findMsgFluxByCp备忘
2010-08-12 14:21 901public List<MsgFlux> fin ...
相关推荐
在计算机网络技术中,人工智能的应用策略主要体现在以下几个方面: 一、提高网络安全性的策略。在大数据时代,网络安全问题日益突出,人工智能技术可以通过其先进的算法和学习能力,对网络数据进行深度分析和处理,...
但是,基于题目要求,我们将围绕“Hibernate存储图片”这一主题展开详细论述,并结合给出的部分内容来尽可能地构建相关知识点。 ### Hibernate 存储图片 在 Java 开发中,特别是在 J2EE 项目中,有时我们需要将...
在《网络营销策略全面论述》中,主要讨论了七个关键领域,包括市场细分、目标市场定位、品牌策略、定价策略、渠道策略、服务策略以及移动电子商务营销策略。 **网络营销的市场细分**是策略的基础,它涉及到将广阔的...
3. 在项目中集成Hibernate框架,配置相关参数,如数据库连接信息、缓存策略等。 4. 编写业务逻辑代码,调用Hibernate API进行数据操作。 5. 运行并测试应用程序,确保数据操作的正确性。 在这个过程中,理解...
保险促销策略论述.pptx
防火墙策略简要论述.pptx
销售策略简要论述.doc
网络安全:论述计算机网络安全防范策略与问题.pdf
### 关于采用Oracle行级安全策略解决应用系统数据权限的论述 #### 一、引言 在现代企业级应用系统中,数据权限管理是一项至关重要的任务。为了确保数据的安全性和合规性,通常需要对不同角色或用户设定不同程度的...
2021年高中数学教资考试简答题论述题答题模板整理【全】.pdf
**Ajax设计策略论述** Ajax(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使得网页实现异步更新,提高了用户体验,降低...
HCIE R&S-论述题 论述简版 临阵磨枪
HCIE 论述题中,问到 QoS 的相关问题,答案是:由于网络存在延时、抖动、拥塞丢包导致,需要根据 DS 域的划分进行端到端的部署,考虑到部署 GRE 隧道,需要在 AR1 和 AR4 上部署 QoS,并执行复杂流分类技术,将 FTP...
论述题可能会要求考生分析UX/UI设计的策略、方法和最佳实践。 10. 设计批评与评估:设计批评是一种评估和分析设计的方法,它有助于提高设计质量。论述题可能会要求考生讨论设计批评的原则和技巧,以及如何通过批评...
本资源摘要信息主要关注HCIE-RS 论述题-路由选择和控制,涵盖路由策略、ACL 和前缀列表等知识点。 1. 路由策略的基本原理 路由策略是一种路由控制机制,通过if-match子句定义匹配条件,检查路由信息的属性,并执行...
在这个系统中,我们看到了Hibernate、Java、JSP、Struts和Spring这些核心组件的结合,它们各自扮演着重要的角色。 首先,Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过...
某软件科技园发展策略论述.doc