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);

    }

 

}

三. Code in GitHub

posted @ 2015-03-12 14:40  ImCoder  阅读(103)  评论(0)    收藏  举报