- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
延迟加载与代理模式
Hibernate 延迟加载剖析与代理模式应用
Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术。这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录。通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销。Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势。
评论:
李 刚, 自由撰稿人
2011 年 11 月 17 日
内容
Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。
下面先来剖析 Hibernate 延迟加载的“秘密”。
集合属性的延迟加载
当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时,完成所有集合属性的抓取,将导致性能急剧下降。完全有可能系统只需要使用持久化类集合属性中的部分记录,而完全不是集合属性的全部,这样,没有必要一次加载所有的集合属性。
对于集合属性,通常推荐使用延迟加载策略。所谓延迟加载就是等系统需要使用集合属性时才从数据库装载关联的数据。
例如下面 Person 类持有一个集合属性,该集合属性里的元素的类型为 Address,该 Person 类的代码片段如下:
清单 1. Person.java
public class Person
{
// 标识属性
private Integer id;
// Person 的 name 属性
private String name;
// 保留 Person 的 age 属性
private int age;
// 使用 Set 来保存集合属性
private SetAddress addresses = new HashSetAddress();
// 下面省略了各属性的 setter 和 getter 方法
...
}
为了让 Hibernate 能管理该持久化类的集合属性,程序为该持久化类提供如下映射文件:
清单 2. Person.hbm.xml
?xml version=1.0 encoding=GBK?
!DOCTYPE hibernate-mapping PUBLIC
-//Hibernate/Hibernate Mapping DTD 3.0//EN
/dtd/hibernate-mapping-3.0.dtd
hibernate-mapping package=org.crazyit.app.domain
!-- 映射 Person 持久化类 --
class name=Person table=person_inf
!-- 映射标识属性 id --
id name=id column=person_id
!-- 定义主键生成器策略 --
generator class=identity/
/id
!-- 用于映射普通属性 --
property name=name type=string/
property name=age type=int/
!-- 映射集合属性 --
set name=addresses table=person_address lazy=true
!-- 指定关联的外键列 --
key column=person_id/
composite-element class=Address
!-- 映射普通属性 detail --
property name=detail/
!-- 映射普通属性 zip --
property name=zip/
/composite-element
/set
/class
/hibernate-mapping
从上面映射文件的代码可以看出,Person 的集合属性中的 Address 类只是一个普通的 POJO。该 Address 类里包含 detail、zip 两个属性。由于 Address 类代码非常简单,故此处不再给出该类的代码。
上面映射文件中 set.../ 元素里的代码指定了 lazy=true(对于 set.../ 元素来说,lazy=true是默认值),它指定 Hibe
文档评论(0)