




已阅读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年网络安全专家招聘面试模拟题及答案全攻略
- 2025年中级气象观测员职业技能鉴定考试趋势分析与预测题解读
- 桐昆集团安全知识培训课件
- 2025年陪诊师考试难点解析试题及答案
- 2025年注册验船师资格考试(C级船舶检验专业基础安全)练习题及答案一
- 河南银行招聘笔试题库及答案
- 施工现场应急预案方案和措施
- 2025年交通运输厅公务员招录考试模拟题及备考指南
- 2025年度注册验船师资格考试船舶检验法律法规强化练习题及答案(手机版)
- 2025年殡葬服务礼仪与沟通技巧模拟题及答案解析
- 《ACT就这么简单》课件
- 农机行政处罚流程图
- 盘阀结构和原理课件
- GB∕T 6818-2019 工业用辛醇(2-乙基己醇)
- 环境、环境问题与环境科学
- 钻具内防喷工具课件
- 新版(七步法案例)PFMEA
- 会计师事务所7(报告流转签发制度12)
- TCECS 20007-2021 城镇污水处理厂污泥厌氧消化工艺设计与运行管理指南
- 社保现金补助协议书
- 《中医内科学血证》PPT课件.ppt
评论
0/150
提交评论