zoukankan      html  css  js  c++  java
  • 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只影响到对象的普通属性。对其它(集合)属性不影响

  • 相关阅读:
    c++模板使用
    配置文件读取(2-2)读取yml
    全景拼接学习-原理篇 (4) 基本过程
    全景拼接学习-原理篇 (3) 从对极几何 单相机拍摄的画面估计运动轨迹
    全景拼接学习-原理篇 (2) 单张图片 单相机成像模型
    全景拼接学习-原理篇 (1) 两张图片之间关系计算 单应性Homograph估计
    js之async和await
    mysql之GORM接口
    casbin应用
    jQuery
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4079386.html
Copyright © 2011-2022 走看看