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

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只影响到对象的普通属性。对其它(集合)属性不影响

 

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