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语句要高
阅读(1835) | 评论(0) | 转发(0) |