Hibernate以多对一方式生成m + 1个查询

Phu*_* An 7 hibernate lazy-loading

我的问题很简单,但我不知道如何让Hibernate以我想要的方式运行: - 表MainTable有很多2-One与ParentTable(有100行).MainTable指向ParentTable中100行中的m = 26行

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID")
@Fetch(FetchMode.JOIN)
Run Code Online (Sandbox Code Playgroud)

当我简单地查询"来自MainTable"时

它将生成26 + 1个查询

当我跟踪查询时,第一个查询仅加载26个以后查询使用的PARENT_ID.我想它应该有在第一个查询中加载整个PARENT_TABLE的方法..

请假设:

  • FetchType.EAGER是必须的
  • 使用来自MainTable mt left join fetch mt.parent parent是好的,但我们有很多关联

Dil*_*eep 4

 // Annotate ParentTable Persistance class file with a batch Size 
 @BatchSize(size=100)
 class ParentTable{
     ..
 }
Run Code Online (Sandbox Code Playgroud)
@ManyToOne
@JoinColumn(name = "PARENT_ID")
Run Code Online (Sandbox Code Playgroud)

这将使查询数量减少 n/100+1。

这个问题的原因是,hibernate会在内部以惰性模式获取数据(我不是在谈论FetchMode.Lazy)。可以使用 排除Lazy模式FetchMode.SUBSELECT,该模式仅适用于集合。当谈到 时@ManyToOne,您可以batch通过指定 来选择数据batchSize

关于 Fetch Startegies 的简短描述

FetchMode.SUBSELECT

父级的一项查询,相关表的一项查询。仅适用于集合框架。仅触发了 2 个查询。

FetchMode.SELECT

父级有 1 个查询,子级有 N 个查询。

FetchMode.JOIN

对父级进行一次查询,对子级进行 N 次查询,但数据库检索是在 JOIN 中预先进行的。

FetchType.Batch

父级的 1 个查询和触发的 n/batchSize + 1 个查询。


根据应执行查询的时间,有两种类型的获取。

FetchType.EAGER:

查询立即被触发。

FetchType.LAZY:

当访问子对象时会触发查询。因此执行的查询数量将取决于访问的子对象的数量。

这里更好地解释了获取策略的工作原理