hibernate 一对一 n+1 问题 请高手帮忙

乌邦托 2011-03-09 04:41:10
人员 和 人员帐号 映射成一对一




人员里关系映射 <one-to-one name="user" property-ref="person"/>

帐号里映射 <many-to-one unique="true" name="person" />


当查询人员的时候使用hql select p from Person p left join p.user u 出现N+1的问题

查询用户 这端 select u from Person p left join p.user u 不会出现N+1问题 请问这个是怎么回事 没想明白
...全文
127 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouyong0 2011-03-10
  • 打赏
  • 举报
回复
4楼的说的好啊! 受教!
youjianbo_han_87 2011-03-10
  • 打赏
  • 举报
回复
Hibernate 中常会用到set,bag等集合表示1 对多的关系, 在获取实体的时候就能根据关系将关联的对象或者对象集取出, 还可以设定cacade进行关联更新和删除。这不得部说hibernate 的orm做得很好,很贴近oo的使用习惯了。
但是对数据库访问还是必须考虑性能问题的, 在设定了1 对多这种关系之后, 查询就会出现传说中的n +1 问题。
1 )1 对多,在1 方,查找得到了n 个对象, 那么又需要将n 个对象关联的集合取出,于是本来的一条sql查询变成了n +1 条
2)多对1 ,在多方,查询得到了m个对象,那么也会将m个对象对应的1 方的对象取出, 也变成了m+1

怎么解决n +1 问题?
1 )lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。
2)二级缓存, 在对象更新,删除,添加相对于查询要少得多时, 二级缓存的应用将不怕n +1 问题,因为即使第一次查询很慢,之后直接缓存命中也是很快的。
不同解决方法,不同的思路,第二条却刚好又利用了n +1 。

3) 当然你也可以设定fetch=join

不知道这样说,你明白了没。
steven19871005 2011-03-09
  • 打赏
  • 举报
回复
你这表建的让人迷惑啊 person中又有个user

我没看懂

再说你select p 为什么要left join p.user u 呢,用了left join 还没有关联条件on?
zhouyong0 2011-03-09
  • 打赏
  • 举报
回复
什么叫n+1
乌邦托 2011-03-09
  • 打赏
  • 举报
回复
没有人!!

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧