hibernate 怎么配置延时加载
1个回答
展开全部
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 Set<Address> addresses = new HashSet<Address>();
// 下面省略了各属性的 setter 和 getter 方法
...
}
为了让 Hibernate 能管理该持久化类的集合属性,程序为该持久化类提供如下映射文件:
清单 2. Person.hbm.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/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>
文章比较长 参考博客:http://blog.csdn.net/xc635960736/article/details/7049863
下面先来剖析 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 Set<Address> addresses = new HashSet<Address>();
// 下面省略了各属性的 setter 和 getter 方法
...
}
为了让 Hibernate 能管理该持久化类的集合属性,程序为该持久化类提供如下映射文件:
清单 2. Person.hbm.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/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>
文章比较长 参考博客:http://blog.csdn.net/xc635960736/article/details/7049863
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询