美文网首页
jpa 关于懒加载的问题

jpa 关于懒加载的问题

作者: EamonZzz | 来源:发表于2018-11-19 12:14 被阅读0次

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

比如:@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 关于懒加载的问题

      本文链接:https://www.haomeiwen.com/subject/gjbofqtx.html