为了账号安全,请及时绑定邮箱和手机立即绑定

JPA和Hibernate中的N + 1问题有什么解决方案?

JPA和Hibernate中的N + 1问题有什么解决方案?

汪汪一只猫 2019-10-10 16:49:15
我知道N + 1问题是执行一个查询以获取N个记录,执行N个查询以获取一些关系记录。但是如何在Hibernate中避免这种情况?
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

Hibernate中1 + N的本机解决方案称为:


20.1.5。使用批量提取

使用批量获取,如果访问了一个代理,Hibernate可以加载多个未初始化的代理。批量抓取是对惰性选择抓取策略的优化。我们可以通过两种方式配置批量获取:在1)类级别和2)集合级别...


检查以下问答:


@BatchSize但在@ManyToOne情况下很多往返

避免n + 1渴望获取子集合元素关联

有了注释,我们可以这样做:


一个class级别:


@Entity

@BatchSize(size=25)

@Table(...

public class MyEntity implements java.io.Serializable {...

一个collection级别:


@OneToMany(fetch = FetchType.LAZY...)

@BatchSize(size=25)

public Set<MyEntity> getMyColl() 

延迟加载和批量提取一起代表了优化,这是:


它不要求任何明确的抓取我们查询

将被应用到加载根实体后(懒惰地)触及的任何数量的引用(而显式访存仅影响查询中命名的那些)

将解决问题1 + N的集合 (因为只能通过根查询获取一个集合),而无需进一步处理即可获得DISTINCT根值(请检查:Criteria.DISTINCT_ROOT_ENTITY与Projections.distinct)


查看完整回答
反对 回复 2019-10-10
  • 3 回答
  • 0 关注
  • 1024 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信