美图齐众专注资阳网站设计 资阳网站制作 资阳网站建设
资阳网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

Hinerbate单端关联代理颇析

在Hinerbate中,对集合的延迟抓取的采用了自己的实现方法。但是,对于Hinerbate单端关联的延迟抓取,则需要采用 其他不同的机制。Hinerbate单端关联的目标实体必须使用代理,Hihernate在运行期二进制级(通过优异的CGLIB库), 为持久对象实现了延迟载入代理。

创新互联公司是一家专注于成都网站制作、成都网站建设、外贸营销网站建设与策划设计,高台网站建设哪家好?创新互联公司做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:高台等地区。高台做网站价格咨询:028-86922220

默认的,Hibernate3将会为所有的持久对象产生代理(在启动阶段),然后使用他们实现多对一(many-to-one)关联和一对一(one-to-one) 关联的延迟抓取。

在映射文件中,可以通过设置proxy属性为目标class声明一个接口供代理接口使用。

默认的,Hibernate将会使用该类的一个子类。 注意:被代理的类必须实现一个至少包可见的默认构造函数,我们建议所有的持久类都应拥有这样的构造函数

在如此方式定义一个多态类的时候,有许多值得注意的常见性的问题,

例如:

 
 
  1.  name="Cat" proxy="Cat"> 
  2.     ......  
  3.      name="DomesticCat"> 
  4.         .....  
  5.      
  6.  

首先,Cat实例永远不可以被强制转换为DomesticCat, 即使它本身就是DomesticCat实例。

 
 
  1. Cat cat = (Cat) session.load(Cat.class, id);  // instantiate a proxy (does not hit the db)  
  2. if ( cat.isDomesticCat() ) {                  // hit the db to initialize the proxy  
  3.     DomesticCat dc = (DomesticCat) cat;       // Error!  
  4.     ....  

其次,代理的“==”可能不再成立。

 
 
  1. Cat cat = (Cat) session.load(Cat.class, id);            // instantiate a Cat proxy  
  2. DomesticCat dc =   
  3.         (DomesticCat) session.load(DomesticCat.class, id);  // acquire new DomesticCat proxy!  
  4. System.out.println(cat==dc);                            // false 

虽然如此,但实际情况并没有看上去那么糟糕。虽然我们现在有两个不同的引用,分别指向这两个不同的代理对象, 但实际上,其底层应该是同一个实例对象:

 
 
  1. cat.setWeight(11.0);  // hit the db to initialize the proxy  
  2. System.out.println( dc.getWeight() );  // 11.0 

第三,你不能对“final类”或“具有final方法的类”使用CGLIB代理。

***,如果你的持久化对象在实例化时需要某些资源(例如,在实例化方法、默认构造方法中), 那么代理对象也同样需要使用这些资源。实际上,代理类是持久化类的子类。

这些问题都源于Java的单根继承模型的天生限制。如果你希望避免这些问题,那么你的每个持久化类必须实现一个接口, 在此接口中已经声明了其业务方法。然后,你需要在映射文档中再指定这些接口。例如:

 
 
  1.  name="CatImpl" proxy="Cat"> 
  2.     ......  
  3.      name="DomesticCatImpl" proxy="DomesticCat"> 
  4.         .....  
  5.      
  6.  

这里CatImpl实现了Cat接口, DomesticCatImpl实现DomesticCat接口。 在load()、iterate()方法中就会返回 Cat和DomesticCat的代理对象。 (注意list()并不会返回代理对象。)

 
 
  1. Cat cat = (Cat) session.load(CatImpl.class, catid);  
  2. Iterator iter = session.iterate("from CatImpl as cat where cat.name='fritz'");  
  3. Cat fritz = (Cat) iter.next(); 

这里,对象之间的关系也将被延迟载入。这就意味着,你应该将属性声明为Cat,而不是CatImpl。

但是,在有些方法中是不需要使用代理的。

例如:

◆equals()方法,如果持久类没有重载equals()方法。

◆hashCode()方法,如果持久类没有重载hashCode()方法。

◆标志符的getter方法。

Hibernate将会识别出那些重载了equals()、或hashCode()方法的持久化类。

若选择lazy="no-proxy"而非默认的lazy="proxy",我们可以避免类型转换带来的问题。然而,这样我们就需要编译期字节码增强,并且所有的操作都会导致立刻进行代理初始化。

以上是对Hinerbate单端关联的具体解析。


当前标题:Hinerbate单端关联代理颇析
地址分享:http://www.zsjierui.cn/article/coeoghi.html

免费获取网站建设与品牌策划方案报价

*主要业务范围包括:高端网站建设, 集团网站建设(网站建设网站制作)找网站建设公司就上美图齐众。
提交需求

    联系我们

    028-86922220
  • 手机:13518219792
  • 地址:成都市太升南路288号锦天国际A幢1002号
  • 24小时服务热线:028-86922220

    网站建设服务

  • 网页设计
  • 网站制作
  • 网站开发

    网站推广服务

  • 营销网站建设
  • 百度快速排名
  • 整站网站推广

    网站运维服务

  • 基础维护
  • 网站改版
  • 网站维护

    FOLLOW US

  • 微信二维码

    微信二维码

Copyright © 2025 资阳站青羊区美图齐众设计工作室(个体工商户) 资阳网站建设公司-选网站建设公司美图齐众!专业的网站制作公司!
All Rights Reserved 版权所有 蜀ICP备2025119604号-1