




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernate_Query_iterate的延迟加载1:通过Query接口的list()方法获取所有对象,然后调用Sesssion.delete(Obj)来删除对象2:通过Query接口的iterate()方法获取Iterator来迭代每个对象分别调用Sesssion.delete(Obj)来删除对象分析:Query.list()方法通过一条select语句来查询整个表来得到所以对象,且获得的对象是完整的.而Query.iterate()方法执行后,发出第一条select语句,只查询表的ID的一列!Entities returned as results are initialized on demand. The first SQL query returns identifiers only.对于每个对象,通过Sesssion.delete(Obj)来删除对象并,要先获取整个对象,当且仅当此时,才发出SQL语句来查询目标对象(行).只有当你对iterate()中的对象进行操作时,Hibernate才会向数据库再次发送SQL语句来获取该对象属性值.这就是Hibernate的”延迟加载”,” initialized on demand”并延迟加载时,Session不能被关闭,就是说如果Session被关闭了后,延迟加载就会抛出异常: org.hibernate.LazyInitializationException: could not initialize proxy - no Sessionat xy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)at xy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)at xy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)at beans.People_$_javassist_0.toString(People_$_javassist_0.java)1:SRC1/Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();Query query = session.createQuery(from People);Iterator iter = query.iterate();People people = (People)iter.next();System.out.println(“-“);System.out.println(people);mit();session.close();/执行结果:通过Debug单步运行,我们会发现 查询people的SQL语句 是在System.out.println(people)执行时才发出的!为什么最终查询people的语句是在System.out.println(people)执行时才出发的?分析:(因为Query.iterate()返回的结果是延迟加载的)People people = (People)iter.next();因为people会被延迟到其真正被使用时才加载.所以上面这一句执行后,people还没有被加载的.System.out.println(people);就在这一句才真正用到people,所以此时才会数据库发出SQL语句/2:SRC2/Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();Query query = session.createQuery(from People);Iterator iter = query.iterate();People people = (People)iter.next();System.out.println(“-“);mit();session.close();System.out.println(people);/执行结果:程序抛出org.hibernate.LazyInitializationException: could not initialize proxy - no Session 异常!System.out.println(people);执行到这一句时,程序的延迟初始化被执行!但因为此时Session已关闭(JDBC的Connection已被关闭)所以无法发出SQL语句,所以抛出异常!Query.iterate()的延迟初始化深入分析(又是动态代理)在SRC1中, People people = (People)iter.next();这一句执行完后,实际查询people的语句还未发出,但people引用的实例是什么呢?看图: 这个对象中的也有People类的所以字段,看看,还有一个handler字段,就是动态代理了嘛,是javassist直接生成字节码来生成的代理类: People_$_javassist_0调用people.toString()后,流程来到: JavassistLazyInitialize.invoke(proxy,thisMethod,proceed,args)方法此时,thisMethod: public java.lang.String beans.People.toString()proceed: public final java.lang.String beans.People_$_javassist_0._d26toString()public Object invoke(final Object proxy,final Method thisMethod,final Method proceed,final Object args) throws Throwable if ( this.constructed ) Object result;try /对要调用的方法进行分类,部分类型的方法直接执行,否则/返回INVOKE_IMPLEMENTATIONresult = this.invoke( thisMethod, args, proxy );catch ( Throwable t ) throw new Exception( t.getCause() );if ( result = INVOKE_IMPLEMENTATION ) /初始化目标:(延迟加载的关键),就在此时才发出SQL语句/第一次访问代理类时,从数据库加载目标对象;/第二次访问代理类或以后时,直接返回Object target = getImplementation();final Object returnValue;try if ( ReflectHelper.isPublic( persistentClass, thisMethod ) ) if ( !thisMethod.getDeclaringClass().isInstance( target ) ) throw new ClassCastException( target.getClass().getName() );/目标被加载后,调用对应的方法(这里是toString()returnValue = thisMethod.invoke( target, args );else if ( !thisMethod.isAccessible() ) thisMethod.setAccessible( true );returnValue = thisMethod.invoke( target, args );return returnValue = target ? proxy : returnValue;catch ( InvocationTargetException ite ) throw ite.getTargetException();/如果方法在result = this.invoke( thisMethod, args, proxy );/已执行,直接返回结果else return result;else / while constructor is runningif ( thisMethod.getName().equals( getHibernateLazyInitializer ) ) return this;else return proceed.invoke( proxy, args );总结: 原理和JDK的动态代理没
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州铜仁市妇幼保健院引进专业技术人才6人考前自测高频考点模拟试题及参考答案详解
- 2025年阜阳颍上县人民医院引进博士研究生2人考前自测高频考点模拟试题及一套参考答案详解
- 2025年甘肃省兰州市西固区中医医院招聘12人考前自测高频考点模拟试题及答案详解(夺冠)
- 2025国网电力空间技术有限公司第二批高校毕业生录用人选的考前自测高频考点模拟试题及完整答案详解
- 2025鄂尔多斯准格尔旗事业单位引进40名高层次人才和急需紧缺专业人才模拟试卷附答案详解(模拟题)
- 2025河南新乡市长垣行知学校招聘中小学教师模拟试卷及完整答案详解一套
- 2025年福建省厦门实验中学招聘1人模拟试卷完整答案详解
- 2025河北中兴冀能实业有限公司高校毕业生招聘(第三批)模拟试卷及答案详解(历年真题)
- 2025福建厦门鼓浪湾大酒店有限公司(第二批)招聘5人考前自测高频考点模拟试题及答案详解(典优)
- 2025春季四川泸州市合江县事业单位人才招聘19人考前自测高频考点模拟试题及参考答案详解一套
- 夜间驾驶知识课件
- 陕西省西工大附中2022-2023学年七年级上学期第一次月考英语试卷(含答案)
- 《近似数》课件人教版数学七年级上册
- 初中校长工作手册范本
- QGDW10212-2019电力系统无功补偿技术导则
- 个人车位租赁合同(含充电桩安装)
- 2025年人教版小学六年级上册奥林匹克数学竞赛测试题(附参考答案)
- 2025年土地承包合同模板下载
- 法律文化-形考作业1-国开(ZJ)-参考资料
- 订购包装木箱合同协议
- 超市员工绩效评估标准
评论
0/150
提交评论