4. 懒加载:
在前面我们已经对懒加载有所提及,现在再借助一个简单的实例(它们均位于lazyLoad 项目下)再来重新认识懒加载:先看下面的代码:
package com.asm.hibernate.test;
public class UserTest2 {
public static void main(String[] args) {
addUser ();
User u = getUser (1);
System. out .println( "return type:" + u + "\t name=" + u.getName());
}
static User getUser( int id) {
Session s = null ;
try {
s = HibernateUtil.getSession ();
User user = (User) s.load(User. class , id);
// 以下的两种方式都可以让懒加载去真正连接数据库。
Hibernate .initialize (user);
// System.out.println(user.getName());
System. out .println( "load--User:" + user.getClass());
return user;
} finally {
if (s != null )
s.close();
}
}
static void addUser() {
省略内容:此方法的作用就是插入一条记录到数据库中,以使我们的查询操作可以进行。
}
}
执行后,打印结果如下:
load--User:class com.asm.hibernate.domain.User$$EnhancerByCGLIB$$212cbff4
return type:com.asm.hibernate.domain.User@1f6ba0f name=jack
注意到上面第一行打印结果,可以发现返回的是User 的一个子类,借此来看看懒加载的实现,懒加载的意思是只有当我们真正要查询的数据时,它才真正去连接数据库,为什么要提出懒加载呢,我们知道数据库的连接是非常耗资源的,有了懒加载可以从一定程度上降低数据库连接资源 的消耗。 懒加载本质 是借助asm.jar 和cglib.jar 这两个jar 包,来生成User 的一个子类,这就是前面提到“使用懒加载时实体类不能是final ”的原因,从这里我们知道hibernate 用构建实体类的子类来实现一个更强大的操作功能,这样即使数据库无记录,查询返回的结果对象也永远不会为null ,即是说“返回的结果对象==null ”永远不能成立,但这并不表示一定查询出了结果。其实如果我们以懒加载查询的结果为空,而我们再对这个对象进行操作时,是会报错得。 概述要点 :(1 )hibernate 构造了实体类的子类来查询(2 )要使用赖加载,实体类不能声明为final (3) 查询结果对象永不为空。 (4 )只要连接未关,如果我们想获知此对象的任何属性信息都会引起懒加载去连接数据库,但是如果我们是企图获取它的id 时,却不能让hibernate 去连接数据库。
补充说明 :其实这种懒加载的使用很少,它通常在需要关联两个实体对象时使用,比如我们希望把查询出的User user 对象关联到部门中去时,即我们 Employee emp=new Employee(); emp.setUser(user); 在这种情况下我们并不关心它的查询内容,只是想关联到部门中去,所以此时使用懒加载是一个节省“数据库连接资源”的好方法。