我知道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)
添加回答
举报
0/150
提交
取消