鹰翔宇空

学习和生活

BlogJava 首页 新随笔 联系 聚合 管理
  110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
原文引自:http://forum.javaeye.com/viewtopic.php?t=18128

众所周知,到了Hibernate3.0以后,关联关系的对象默认都是使用延迟加载,例如<one-to-many>时.但我在映射<one-to-one>,<many-to-one>关系时指定了lazy="true",但是在查询对象时,我只想查询一个对象,仍然会把这个对象所关联的<one-to-one>,<many-to-one>对象一起查询出来,这样造成了极大的性能浪费.在不指定lazy属性时,<many-to-one>所关联的对象反而会延迟加载,这让我大为困惑,还以为是Hibernate的bug.
在网上查找资料,说在为了延迟加载<one-to-one>,<many-to-one>所关联的对象,需要设置被关联的对象<class name="" lazy="true">,我也这样做了,但是仍然没有效果.
仔细阅读了Hibernate的手册,才发现原来要延迟加载<one-to-one>,<many-to-one>所关联的对象时,除了要指定lazy="true"外,还需要运行期字节码增强,而我省去了这一步,所以延迟加载没有效果.同时还发现在默认情况下,<one-to-one>,<many-to-one>的lazy属性是"proxy"而不是"true"!因此如果直接采用lazy的默认值,是可以延迟加载的.
总结一下:
<many-to-one>默认的属性是lazy="proxy",此时默认是会延迟加载的.在指定了lazy="true"之后,必须要经过运行期字节码增加,延迟加载才有效果.
而<one-to-one>相对要复杂一点,延迟加载还要受到constrained属性的限制.constrained="false"时表明实体和被关联到的实体的约束不是强制的,即存在一个实体时,它通过<one-to-one>关联的实体可能存在,也可能不存在,这时在查询实体时,Hibernate总会发起一次查询检查<one-to-one>所关联的实体是否存在,而这时已经可以把one-to-one关联的实体查询出来了,因此在<one-to-one>关系中,如果constrained="false",总是会立即加载关联到的实体.
如果当constrained="true",且lazy="proxy"(默认),是可以延迟加载的.
如果当constrained="true",且lazy="true"时,需要经过运行期字节码增加,延迟加载才会奏效.

但是这里我还是有个疑问,既然在lazy="proxy"时,已经实现了延迟加载的效果,为什么在lazy="true"时,还需要动态字节码增强才能实现延迟加载呢?


Re: Hibernate中的延迟加载


以后在one-to-one或many-to-one中不会再有lazy="true"了,你可以理解成no-proxy.

[1]起码还是好的方向: 默认就可以lazy了. 而且来了extra :)
[2]写Hibernate的哥们也是要活命的嘛, 不改变怎么来的咨询费, 不过Hibernate的migration写的也还不错.
[3]constrained如你所说, 而且我估计这个属性以后不会有太大变更.

hope that helps :)
regards
posted on 2006-02-10 09:47 TrampEagle 阅读(2826) 评论(1)  编辑  收藏 所属分类: hibernate

Feedback

# re: Hibernate中的延迟加载 2008-11-18 11:07 ccc
cccc  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问