018 关联映射文件中<class>标签中的lazy(懒加载)属性

Lazy(懒加载):

只有在正真使用该对象时,才会创建这个对象

Hibernate中的lazy(懒加载):

只有我们在正真使用时,它才会发出SQL语句,给我们去查询,如果不使用对象则不会发SQL语句进行查询。

Hibernate中lazy(懒加载)的实现:

         采用了第三方组件的库,这个库叫cglib.jar(比较流行),这个库对我们的类生成代理类(JDK的动态代理,只能对JDK中实现了接口的类进行代理),代理可以控制源对象并且可以对源对象的功能进行增强,而cglib.jar可以对类进行代理(cglib对我们的类进行继承,生成一个子类,这个子类作为代理类返回给你)。

只有你正真代理类的方法,则会查看你有没有加载目标对象,如果没有则会加载目标对象。

Lazy(懒加载)在hibernate何处使用:

         1、<class>标签上,可以取值:true/false,(默认值为:true)

         2、<property>标签上,可以取值:true/false,需要类增强工具

         3、<set>、<list>集合上,可以取值:true/false/extra,(默认值为:true)

         4、<one-to-one>、<many-to-one>单端关联上,可以取值:false/proxy/noproxy

 

Session.load()方法支持lazy,而session.get()不支持lazy;

 

Hibernate的lazy生效期:

生效期和session一样的,session关闭,lazy失效

 

hibernate支持lazy策略只有在session打开状态下有效。

 

<class>标签上,可以取值:true/false,(默认值为:true):

 

实例一:设置<class标签上的lazy=true(默认)

session = HibernateUtils.getSession();

            tx = session.beginTransaction();   
            //执行此语并不会发SQL语句,只是返回一个代理类
            Group group =(Group)session.load(Group.class, 1);           
            //不会发SQL语句,使用上面输入的1值
            System.out.println("group.id=" + group.getId());           
            //此处使用对象,会发出SQL语句
            System.out.println("group.name=" + group.getName());           
            //提交事务
            tx.commit();

 

实例二:设置<class标签上的lazy=true(默认)

Session session = null;
        Transaction tx = null;
        Group group = null;          
       try {
           session = HibernateUtils.getSession();
            tx = session.beginTransaction(); 
            group =(Group)session.load(Group.class, 1);         
            System.out.println("group.name=" + group.getName());         
            //提交事务
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            HibernateUtils.closeSession(session);
        }

        //不能正确输出,抛出了LazyInitalizationException异常,因为session已经关闭
        //hibernate支持lazy策略只有在session打开状态下有效。

        System.out.println("group.name=" + group.getName());

 

    注:<class>标签上的lazy只影响到对象的普通属性。对其它(集合)属性不影响

 

posted @ 2014-11-06 17:10  crazyYong  阅读(498)  评论(0编辑  收藏  举报