Hibernate延迟加载功能介绍
hibernate延迟加载只对load,get,find等一些方法有用,对hql等写SQL的方法无效。(但是属性延迟加载的例子不就是使用HQL么???)
hibernate提供了对实体对象、集合、属性三种类型的延迟加载。
一、实体对象的延迟加载
配置方法
<hibernate-mapping>
<class name="com.neusoft.entity.User" table="user" lazy="true">
...
</class>
</hibernate-mapping>
使用:
User user=(User)session.load(User.class, "1"); //lazyload point
System.out.println("user.getName()); //really load
利用CGLIB做中间代理,实现了实体的延迟加载功能。
只有session.load()方法才会利用实体延迟加载,
因为只有session.load()方法才会返回实体类的代理对象。
B 集合类型的延迟加载(最重要)
Hibernate独立实现了JDK Collection系列的类。
在一对多关联中,定义的用来容纳关联对象的Set集合,net.sf.hibernate.collection.Set类型。
通过使用自定义集合类,Hibernate实现了集合类型的延迟加载。
配置方法:
<hibernate-mapping>
<class name="com.neusoft.entity.User" table="user">
...
<set name="address" table="address" lazy="true" inverse="true">
<key column="user_id"/>
<one-to-many class="com.neusoft.entity.Address"/>
</set>
</class>
</hibernate-mapping>
使用:
user user=(User)session.load(User.class, "1");
Collection addset = user.getAddress(); //lazyload point
Iterator it = addset.iterator(); //really load
...
一个新的概念,数据索引
Hibernate中对集合类型进行缓存时是分两部分进行的。
首先缓存集合中所有实体的id列表,然后缓存实体对象。
这些实体对象的id列表,就是所谓的数据索引。
注意:
如果设置如下缓存策略:
<set name='..>
<cache usage="read-only"/>
...
</set>
hibernate只对集合数据的索引进行缓存。
要想对集合类型的实体也进行缓存,需要这样配置:
<set name='..>
<cache usage="read-write"/>
...
</set>
C 属性延迟加载
配置如下:
<hibernate-mapping>
<class name="com.neusoft.entity.User" table="user">
...
<property name="resume" type="java.sql.Clob" column"resume" lazy="true"/>
</class>
</hibernate-mapping>
使用:
String sql="from User user where user.name='zx'";
Query query = session.createQuery(sql) //(1)lazyload point
List list = query.list();
for(int i=0;i<list.size();i++){
User user = (User)list.get(i);
System.out.println(user.getName());
System.out.println(user.getResume()); //(2)really load
}
说明:
当执行到(1)处时,会生成如下的SQL语句:
select id, age, name from user where name='zx'
这时Hibernate会检索User实体中所有非延迟加载属性对应的字段数据。
当执行到(2)处时,会生成如下SQL语句:
select resume from user where id='1';
这时会发起对resume字段数据真正的读取操作。
来源:
http://wenku.baidu.com/view/433301254b35eefdc8d333e7.html