博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate懒加载
阅读量:5243 次
发布时间:2019-06-14

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

Hibernate懒加载解析hibernatejoinsession数据库sqlobjectHibernate懒加载解析在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。   实现懒加载的前提: 1 实体类不能是final的2 能实现懒加载的对象都是被CGLIB(反射调用)改写的代理对象,所以不能是final修饰的3 须要asm,cglib两个jar包4 相应的lazy属性为true5 相应的fetch属性为select 下面几种可以实现懒加载功能:1、   通过Session.load()实现懒加载load(Object, Serializable):根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。用load()的时候会发现不会打印出查询语句,而使用get()的时候会打印出查询语句。使用load()时如果在session关闭之后再查询此对象,会报异常:could not initialize proxy - no Session。处理办法:在session关闭之前初始化一下查询出来的对象:Hibernate.initialize(user);使用load()可以提高效率,因为刚开始的时候并没有查询数据库。但很少使用。2、   one-to-one(元素)实现了懒加载。在一对一的时候,查询主对象时默认不是懒加载。即:查询主对象的时候也会把从对象查询出来。需要把主对象配制成lazy="true" constrained="true"  fetch="select"。此时查询主对象的时候就不会查询从对象,从而实现了懒加载。一对一的时候,查询从对象的是默认是懒加载。即:查询从对象的时候不会把主对象查询出来。而是查询出来的是主对象的代理对象。3、   many-to-one(元素)实现了懒加载。多对一的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。多对一的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy".具体设置成什么要看你的需求,并不是说哪个设置就是最好的。在
标签上:当为true时,会有懒加载特性,当为false时会产生N+1问题,比如一个学生对应一个班级,用一条SQL查出10个学生,当访问学生的班级属性时Hibernate会再产生10条SQL分别查出每个学生对应的班级.lazy= 什么时候捉取fetch= 捉取方式:select=关联查询;join=连接表的方式查询(效率高)fetch=join时,lazy的设置将没有意义.4、 one-to-many(元素)懒加载:默认会懒加载,这是必须的,是重常用的。一对多的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。一对多的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。需要配置主对象中的set集合lazy="false" 这样就配置成是不懒加载了。或者配置抓取方式fetch="join"也可以变成不懒加载。 实现懒加载的方案:方法一:(没有使用懒加载) 用 Hibernate.initialize(de.getEmps()) 提前加载一下. 方法二:把与Session脱离的对象重新绑定lock()方法是用来让应用程序把一个未修改的对象重新关联到新session的方法。//直接重新关联session.lock(fritz,LockMode.NONE);//进行版本检查后关联session.lock(izi,LockMode.READ);//使用SELECT... FOR UPDATE进行版本检查后关联session.lock(pk,LockMode.UPGRADE);方法三:OpenSessionInView参见 http://www.javaeye.com/topic/32001 fetch 和 lazy 配置用于数据的查询 lazy 参数值常见有 false 和 true,Hibernate3映射文件中默认lazy = true ;fetch 指定了关联对象抓取的方式,参数值常见是select和join,默认是select,select方式先查询主对象,再根据关联外键,每一个对象发一个select查询,获取关联的对象,形成了n+1次查询;而join方式,是leftouter join查询,主对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。 在映射文件中,不同的组合会使用不同的查询: 1、lazy="true" fetch = "select" ,使用延迟策略,开始只查询出主对象,关联对象不会查询,只有当用到的时候才会发出sql语句去查询 ;2、lazy="false" fetch = "select" ,没有用延迟策略,同时查询出主对象和关联对象,产生1+n条sql. 3、lazy="true"或lazy="false"fetch = "join",延迟都不会作用,因为采用的是外连接查询,同时把主对象和关联对象都查询出来了. 另 外,在hql查询中,配置文件中设置的join方式是不起作用的,而在其他查询方式如get、criteria等是有效的,使用 select方式;除非在hql中指定join fetch某个关联对象。fetch策略用于get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/weiguo21/p/4823985.html

你可能感兴趣的文章
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
爬虫-通用代码框架
查看>>
2019春 软件工程实践 助教总结
查看>>
YUV 格式的视频呈现
查看>>
Android弹出框的学习
查看>>
现代程序设计 作业1
查看>>
在android开发中添加外挂字体
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>
多线程实现资源共享的问题学习与总结
查看>>
Learning-Python【26】:反射及内置方法
查看>>
torch教程[1]用numpy实现三层全连接神经网络
查看>>
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>