jpa 关于懒加载的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jpa 关于懒加载的问题相关的知识,希望对你有一定的参考价值。

参考技术A 因为在设计一个树形结构的实体中用到了多对一,一对多的映射关系,在加载其关联对象的时候,为了性能考虑,很自然的想到了懒加载。

比如:@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)

也由此遇到了N+1的典型问题 : 通常1的这方,通过1条SQL查找得到1个对象,而JPA基于Hibernate,fetch策略默认为select(并非联表查询),由于关联的存在 ,又需要将这个对象关联的集合取出,集合数量是N,则要发出N条SQL,于是本来的1条联表查询SQL可解决的问题变成了N+1条SQL

JPA2.1 支持 通过@EntityGraph及其子类型@NamedEntityGraph来定义获取和负载.它们可以被直接在实体类上,用来配置查询结果的获取计划.获取的方式(获取/负载)可以通过@EntityGraph的type属性来进行配置

在一个实体类上定义 @NamedEntityGraph(name = "GroupInfo.detail",attributeNodes =@NamedAttributeNode("members"))

在repository接口中对需要进行关联查询的方法接口上引用实体类上定义的@NamedEntityGraph

@EntityGraph(value = "GroupInfo.detail", type = EntityGraphType.FETCH)

它也可以通过@EntityGraph注解来直接点对点的指定entity graphs.假如依照EntityGraph attributePaths可以被正确的找到,就可以不用在实体类上写@NamedEntityGraph注解了

@EntityGraph(attributePaths ="certData")

以上是关于jpa 关于懒加载的问题的主要内容,如果未能解决你的问题,请参考以下文章

jpa 设置懒加载怎么手动加载

jpa如何懒加载大字段,懒加载之后又如何获取懒加载字段

springcloud JPA 懒加载失败

JPA 懒加载问题

JPA数据懒加载LAZY和实时加载EAGER(转)

JPA 懒加载实践 fetch = FetchType.LAZY