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中无效。

经过测试发现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中无效。

猜你喜欢

转载自svsesunyuan.iteye.com/blog/1026389
今日推荐