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的方法..
请假设:
// 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:
当访问子对象时会触发查询。因此执行的查询数量将取决于访问的子对象的数量。
| 归档时间: |
|
| 查看次数: |
5838 次 |
| 最近记录: |