{Hibernate} outer-join属性并不简单

[环境]
hibernate-2.1.7c
JBuilderX
MS SQLSERVER 2K
[正文]
Lazy属性做为Hibernate的提升性能的一个重要参数...想必已被大家所熟知...虽然Hibernate2.1.*里面还不支持对于property的延迟加载...但是正确并且灵活的设置XXX-to-many中的Lazy属性, 可以给程序性能带来很大提高

请先看看下面这段配置
<set name="moderators" lazy="true" inverse="false" outer-join="true" cascade="all" order-by="creationDate asc">
   <key column="forumid"/>
   <one-to-many class="ModeratorPO"/>
  </set>
正如我一厢情愿的,此段代码在我的程序中使用了很长时间,我也一度自以为是的以为它为我实现了moderators集合的延迟加载,可是当我仔细得阅读了Hibernate为我的getObject()方法输出得SQL时...我发现我取得的是一个很大的SQL列表,竟有十余条之多

难道lazy设置失效了么?反复的调试,查看文档,google........

最终在分析输出的SQL后发现了“罪魁祸首”: outer-join

其实原因很简单, outer-join即外连接抓取,Hibernate将分开的N条SQL语句通过table_nameA left join table_nameB on(具体语法由实际的DBMS决定)来合并成一条SQL提交给数据库,并返回PO对象以及Collection的PO列表,这本也是Hibernate提升性能减少数据库访问的一个优化措施..但是在获取Collection时,采用outer-join就导致了collection与PO对象本身同时提交到查询,也就变相的失去了延迟加载的效果

经多次测试  当outer-join=true时,你的lazy属性无论设置为任何值,Collection都会初始加载(one-to-one没有lazy  因此不必考虑^_^)

请大家谨慎设置outer-join=true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值