集合属性的延迟加载

发表于:2012-8-17 09:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:JDBC    来源:51Testing软件测试网采编

  Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。

  下面先来剖析 Hibernate 延迟加载的“秘密”。

  集合属性的延迟加载

  当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时,完成所有集合属性的抓取,将导致性能急剧下降。完全有可能系统只需要使用持久化类集合属性中的部分记录,而完全不是集合属性的全部,这样,没有必要一次加载所有的集合属性。

  对于集合属性,通常推荐使用延迟加载策略。所谓延迟加载就是等系统需要使用集合属性时才从数据库装载关联的数据。

  例如下面 Person 类持有一个集合属性,该集合属性里的元素的类型为 Address,该 Person 类的代码片段如下:

  清单 1. Person.java

  1. public class Person   
  2.   {   
  3.   // 标识属性 
  4.   private Integer id;   
  5.   // Person 的 name 属性 
  6.   private String name;   
  7.   // 保留 Person 的 age 属性 
  8.   private int age;   
  9.   // 使用 Set 来保存集合属性 
  10.   private Set<Address> addresses = new HashSet<Address>();   
  11.   // 下面省略了各属性的 setter 和 getter 方法 
  12.   ...   
  13.   }

  为了让 Hibernate 能管理该持久化类的集合属性,程序为该持久化类提供如下映射文件:

  清单 2. Person.hbm.xml

  1. <?xml version="1.0" encoding="GBK"?>   
  2.   <!DOCTYPE hibernate-mapping PUBLIC   
  3.  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4.  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">   
  5.   <hibernate-mapping package="org.crazyit.app.domain">   
  6.   <!-- 映射 Person 持久化类 -->   
  7.   <class name="Person" table="person_inf">   
  8.   <!-- 映射标识属性 id -->   
  9.   <id name="id" column="person_id">   
  10.   <!-- 定义主键生成器策略 -->   
  11.   <generator class="identity"/>   
  12.   </id>   
  13.   <!-- 用于映射普通属性 -->   
  14.   <property name="name" type="string"/>   
  15.   <property name="age" type="int"/>   
  16.   <!-- 映射集合属性  -->   
  17.   <set name="addresses" table="person_address" lazy="true">   
  18.   <!-- 指定关联的外键列 -->   
  19.   <key column="person_id"/>   
  20.   <composite-element class="Address">   
  21.   <!-- 映射普通属性 detail -->   
  22.   <property name="detail"/>   
  23.   <!-- 映射普通属性 zip -->   
  24.   <property name="zip"/>   
  25.   </composite-element>   
  26.   </set>   
  27.   </class>   
  28.   </hibernate-mapping>

  从上面映射文件的代码可以看出,Person 的集合属性中的 Address 类只是一个普通的 POJO。该 Address 类里包含 detail、zip 两个属性。由于 Address 类代码非常简单,故此处不再给出该类的代码。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号