浏览 2318 次
锁定老帖子 主题:hibernate lazy的问题学习总结
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-24
以前碰到一个延迟加载问题,就是lazy=true的时候出现session close后读取不到数据,出现错误,现在这里总结一下经验: 一:lazy=false,这种方式效率底,不合适. 二:fetch=join,这种方式和上一种差不多. 三:使用OpensessionInView,这种方式事务管理有很多不稳定性(主要存在事务边界的不确定性),此时lazy=true. 四:就是在DAO层把数据read出来,lazy=true,这样不符合ORM关联查询思想. 五:个人认为最佳方案,就是使用动态外连接查询,此时lazy=true. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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某个关联对象。 |
|
返回顶楼 | |