首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate N+1有关问题及解决方法

2012-10-16 
Hibernate N+1问题及解决办法Hibernate N+1问题及解决办法Hibernate中常会用到set,bag等集合表示1对多的关

Hibernate N+1问题及解决办法

Hibernate N+1问题及解决办法

Hibernate中常会用到set,bag等集合表示1对多的关系,在获取实体的时候就能根据关系将关联的对象或者对象集取出,还可以设定cacade进行关联更新和删除。这不得不说hibernate的orm做得很好,很贴近oo的使用习惯了。

但是对数据库访问还是必须考虑性能问题的,在设定了1对多这种关系之后, 查询就会出现传说中的n+1问题。

一对多:在一方,查找得到了n个对象,那么又需要将n个对象关联的集合取出,于是本来的一条sql查询变成了n+1条;

多对一:在多方,查询得到了m个对象,那么也会将m个对象对应的1方的对象取出, 也变成了m+1;

Hibernate抓取策略(单端代理的抓取策略)

?? 保持默认也就是如下:

??? <many-to-one name="clazz"cascade="save-update" fetch="select" />

??? fetch="select"就是另外发送一条select语句抓取当前对象关联实体或者集合设置fetch="join"

???? <many-to-one name="clazz"cascade="save-update" fetch="join"/>

Hibernate会通过select语句使用外连接来加载器关联实体活集合此时lazy会失效

如:产品product和产品分类product_category两张表,多对一关系。查询产品列表时

select newMap(p.id as id, p.name as name, p.category.name as categoryName) from Product p

热点排行