03-Hibernate中的懒加载
一.Hibernate的懒加载演示
1. 当调用load方法,返回的实体对象是经过处理的代理对象,只有当实际使用时候才会发sql查询
2. 当返回一个通过懒加载的实体对象,返回的时候session已经关闭,代表返回的对象是detached状态,在访问其属性将会报错,异常信息如下:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
3. 如果ID不存在数据库中返回的代理实体对象不为空,但只包含id属性,当调用get方法,返回的是实体对象,如果id不存在数据库中则返回空值
二.测试代码
/**
* @author Administrator
* Hibernate的懒加载演示
* 1. 当调用load方法,返回的实体对象是经过处理的代理对象,只有当实际使用时候才会发sql查询
* 如果ID不存在数据库中返回的代理实体对象不为空,但只包含id属性
* 2. 当调用get方法,返回的是实体对象,如果id不存在数据库中则返回空值
*/
public class TestLazyLoad {
/**
* 调用load方法获取实体对象,但是不访问,不会发sql查询
*/
@Test
public void testLazyLoad01() {
Session session=null;
session=HibernateUtil.openSession();
//返回的对象是经过包装的代理对象,即使id不存在,实体对象也不为空
User u=(User)session.load(User.class, 999L);
//id是查询就知道的,所以访问id属性仍然不会发送sql查询
System.out.println(u.getId());
HibernateUtil.closeSession(session);
}
/**
* 调用load方法获取实体对象,访问对象,此时发sql查询
*/
@Test
public void testLazyLoad02() {
Session session=null;
session=HibernateUtil.openSession();
//返回的对象是经过包装的代理对象,即使id不存在,实体对象也不为空
User u=(User)session.load(User.class, 1L);
System.out.println(u);
HibernateUtil.closeSession(session);
}
/**
* 调用经过load加载,并且是detached状态的实体对象,访问对象会抛异常
* org.hibernate.LazyInitializationException: could not initialize proxy - no Session
*/
@Test
public void testLazyLoad03() {
LazyLoadDemo lazyLoad=new LazyLoadDemo();
//返回的实体对象已经是detached状态,所以抛出异常
//org.hibernate.LazyInitializationException: could not initialize proxy - no Session
User u=lazyLoad.getUserById(1L);
System.out.println(u);
}
/**
* 调用get方法获取实体对象,不管是否访问对象,都会发sql查询
*/
@Test
public void testGet01() {
Session session=null;
session=HibernateUtil.openSession();
//如果id不存在数据库中,返回值为空
User u=(User)session.get(User.class, 1L);
HibernateUtil.closeSession(session);
}
}

浙公网安备 33010602011771号