Chinaunix首页 | 论坛 | 博客
  • 博客访问: 741339
  • 博文数量: 225
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2722
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-03 17:32
文章分类

全部博文(225)

文章存档

2019年(7)

2018年(16)

2017年(1)

2016年(26)

2015年(41)

2014年(15)

2013年(119)

我的朋友

分类: Java

2013-04-28 10:56:33

hibernate为了性能的考虑引入lazy的概念,拿parent和child举例吧:
parent{
int id;
child child;
}
child{
int id;
parent parent;
}
很明显他们是一对多的关系。
在查询parent时,默认不查询child,当在parent的配置文件中加了,lazy=“false”,就能加载childs的内容。
fetch=select的时候,一次查询N+1条记录,先查出parent,然后根据id再查出N条child。
fetch=join的时候,则是通过一条join语句,一次查询出parent和child。
但有一点需要说明,fetch属性只适用于get,load或creteria方式的查询,hql查询不起作用,除非在hql里面使用了join操作例如:
from parent p join fetch parent.child;
总结:fetch相当于手动抓取子的对象,而lazy=false则是通过配置的方式抓取子类对象;
如果lazy="true",把fetch去掉就会报异常,如果lazy=false就不需要fetch了。
fetch设置为lazy,查询Parent对象的时候,默认只有Parent的内容,并不包含child的信息,这样可以避免n+1问题。

    但又想查询parent时把children得到,就可以用fetch。

    fetch主动将child得到并set到children列表中。

    HQL语句:from Parent p left join fetch p.children

* 在hql语句中加入"fetch"后,此hql语句变为了"迫切HQL"语句,这样的查询效率要比没加的hql语句要高
阅读(1833) | 评论(0) | 转发(0) |
0

上一篇:程序员的7个坏习惯

下一篇:java设计模式

给主人留下些什么吧!~~