`
beyondqinghua
  • 浏览: 41532 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

hibernate lazy的问题学习总结

    博客分类:
  • JEE
阅读更多

   以前碰到一个延迟加载问题,就是lazy=true的时候出现session close后读取不到数据,出现错误,现在这里总结一下经验:

一:lazy=false,这种方式效率底,不合适.

二:fetch=join,这种方式和上一种差不多.

三:使用OpensessionInView,这种方式事务管理有很多不稳定性(主要存在事务边界的不确定性),此时lazy=true.

四:就是在DAO层把数据read出来,lazy=true,这样不符合ORM关联查询思想.

五:个人认为最佳方案,就是使用动态外连接查询,此时lazy=true.

分享到:
评论
1 楼 beyondqinghua 2008-06-03  
这段时间又碰到了问题,发现还是没有效果,对lazy和fetch的作用认识还不够.

原本以为设置lazy="true",在hql中指定outer join就会导航到对应的子数据中去,但是实际却令人失望.最后,为了达到预期效果,不得不使用fetch属性来实现预期效果.

fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;
而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
如果你的关联对象是延迟加载的,它当然不会去查询关联对象。
另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定join fetch某个关联对象。

相关推荐

Global site tag (gtag.js) - Google Analytics