Hibernate One to Many 迟延加载分析_第1页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、hibernate one to many 迟延加载分析1: oneto many,默认是采纳延迟加载的(lazy=ue),由于无数状况下,当我们猎取到one的一方后,many的一方并非立刻需要的,当我们常常只需要one的一方的时候,延迟加载就很故意义了. 2:hibernate 中的延迟加载(lazy loading),当我们在程序中猎取到了一的一方,但是不需要多的一方,那么用法延迟加载就是十分适合的. 3:当我们one和many都要同时需要的时候,我们可以将one的一方的hbm.xml中用于保存many的set元素的lazy改为fae one to many的延迟加载分析 当我们通过通过s

2、ession.get()查询到one的一方后,其中用于保存many的set其实是一个代理,其类型为org.hibernate.lection.persistentset, persistentset 实现了java.util.set接口,并内置了一个用于存放实际数据的hashset,初始时为空,当真刚要拜访这个集合的元素时,如调用java.util.setiterator()toarray() containsall(),tostring,equal()hashcode等要真正拜访集合的元素的办法的时候,程序才主要发出sql语句,真正加载many一方,并且一次读取完many一方的全部元素. p

3、ersistentset 实现了java.util.set接口,并内置了一个hashset实例,persistentset代理了java.util.set的iterator()toarray() containsall(),tostring等办法: 而代理的过程很容易: 若要拜访到many的数据,则先加载many的全部元素,再容易调用被代理的办法! 这里也是应用到 代理模式 的思想.框架里,这个模式很常用. 在hibernate里,延迟加载基本是用 代理模式 实现的! 如: public class persistentset tendsabstractpersistentcollection

4、 implements java.util.set 。 publicstring tostring() read(); /先加载many一方 return .tostring(); 。 再看看read()办法: public abstract classabstractpersistentcollection implementsserializable, persistentcollection * call by any read-only method of the collection interface protected final vo read() initialize(fal

5、se); protecteinal void initialize(boolean writing) if (!initialized) if(initializing) throw new lazyinitializationexception( illegal access toloading collection /检查与数据库的衔接 throwlazyinitializationexceptionifnotconnected(); /这里真正加载many session.initializecollection(this, writing); . order - many-to-one

6、 - customer 在many.hbm.xml中 many-to-one name= customer > /many-to-one 1. lazy= false false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象 意为: 在many一方中查询出一个对象之后,同时也要查出one的一方. one的一方的类型为one的实际类型(非代理类,这里是customer) 2. lazy= proxy /这是默认 proxy:这是hibernate对单端关联的默认懒加载策略,即惟独在调用到其关联对象的办法的时候才真正发出查询语句查询其对象数据,其关联对象是代理类 意为:

7、在many一方中查询出一个对象之后,one的一方用代理类代替(customer_$_javassist_1),这个代理只包含one的一方的id,而这个id是在many这一方的标识one的外键,目的是为了延迟初始化one的一方.,当真正拜访one的一方时,才正式初始化它.所以终于取得的是代理类(非实际的customer类型,初始化前只含customer的id) 3.lazy= no-proxy 不常用,那个” 编译时字节码增加”都不知道是什么了的本人没有什么增加工具的状况,效果和proxy一样的,也是用代理类 customer_$_javassist_1 来代理了customer对象,用反射分析

8、到两种状况下的代理类的字段,办法都一样的这个不管了. 网上的分析: child - many-to-one - parent class child private parent parent; public parent getparent () return this.parent;/拜访了实例变量 class parent private string name; public string getname() return ;/拜访了实例变量 public void f() system.out.print( invokeing f() /没有拜访实例变量 假如 many-to-one 的lazy设为proxy,当child.getparent().getname()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论