hibernate fetch 和lazy
?
经过测试发现Hibernate annotation中@ManyToOne,@OneToMany,@OneToOne中lazy的默认值是不同的
@OneToMany 默认Lazy为true
@ManyToOne,@OneToOne 默认lazy为false
在设置@ManyToOne的时候我们一般都会设置Lazy=true
一般不会在@ManyToOne,@OneToOne考虑这个问题
但实际hibernate进行load是时候是把一端也load出来的
fetch 和 lazy 主要是用来级联查询的
而 cascade 和 inverse 主要是用来级联插入和修改的
fetch参数指定了关联对象抓取的方式是select查询还是join查询,
??? select方式时先查询返回要查询的主体对象(列表),再根据关联外键 id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;
??? 而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
如果你的关联对象是延迟加载的,它当然不会去查询关联对象。
另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用 select方式,除非你在hql中指定join fetch某个关联对象。
fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。