博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
018 关联映射文件中<class>标签中的lazy(懒加载)属性
阅读量:6517 次
发布时间:2019-06-24

本文共 1970 字,大约阅读时间需要 6 分钟。

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

 

转载地址:http://htofo.baihongyu.com/

你可能感兴趣的文章
加强Eclipse代码自动提示的方法
查看>>
GNS3-地址重叠环境中部署IPsec
查看>>
exchange online 用户疑问之许可证和用户数据归档
查看>>
QImage Mat IplImage 之间的相互转换
查看>>
使用eclipse与android studio 在开发自定义控件时的区别
查看>>
我的友情链接
查看>>
mysql学习笔记
查看>>
年年有鱼游戏Android源码项目
查看>>
java使用Iterator、for循环同步数据
查看>>
创建镜像iso文件
查看>>
Linux下创建软RAID5和RAID10实战
查看>>
C++类的存储
查看>>
ActiveReports 报表应用教程 (8)---交互式报表之动态过滤
查看>>
解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()
查看>>
跟我一起学docker(四)--容器的基本操作
查看>>
磁化强度
查看>>
C/C++ 数据范围
查看>>
LVS+keepalived+nginx
查看>>
monkey如何通过uiautomatorviewer的bounds坐标点击控件
查看>>
第22章,mysql数据库-1
查看>>