2008-04-24
hibernate lazy的问题学习总结
以前碰到一个延迟加载问题,就是lazy=true的时候出现session close后读取不到数据,出现错误,现在这里总结一下经验:
一:lazy=false,这种方式效率底,不合适.
二:fetch=join,这种方式和上一种差不多.
三:使用OpensessionInView,这种方式事务管理有很多不稳定性(主要存在事务边界的不确定性),此时lazy=true.
四:就是在DAO层把数据read出来,lazy=true,这样不符合ORM关联查询思想.
五:个人认为最佳方案,就是使用动态外连接查询,此时lazy=true.
评论
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某个关联对象。
原本以为设置lazy="true",在hql中指定outer join就会导航到对应的子数据中去,但是实际却令人失望.最后,为了达到预期效果,不得不使用fetch属性来实现预期效果.
fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;
而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
如果你的关联对象是延迟加载的,它当然不会去查询关联对象。
另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定join fetch某个关联对象。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 784 次
- 性别:

- 来自: 南昌

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
hibernate 使用复合主键的 ...
问题没解决,反倒放进了新手贴,寒心!
-- by beyondqinghua -
hibernate 使用复合主键的 ...
我的意思是大家怎么处理复合主键,因为对Hibernate在企业中的应用不熟悉,大 ...
-- by beyondqinghua -
hibernate 使用复合主键的 ...
tangdaibing 写道不知道楼主要问的问题是什么,没有搞清楚楼主的意思 ...
-- by wxb_love -
hibernate 使用复合主键的 ...
不知道楼主要问的问题是什么,没有搞清楚楼主的意思
-- by tangdaibing -
hibernate lazy的问题学习 ...
这段时间又碰到了问题,发现还是没有效果,对lazy和fetch的作用认识还不够. ...
-- by beyondqinghua






评论排行榜