我的问题非常简单,但我不知道如何让Hibernate以我想要的方式运行: - 表MainTable有多个2-One和ParentTable(有100行)。 MainTable指向在ParentTable中100行中的m = 26行
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID")
@Fetch(FetchMode.JOIN)
当我简单地查询“来自MainTable”
时它将生成26 + 1个查询
当我跟踪查询时,第一个查询仅加载26个以后查询使用的PARENT_ID。我想它应该有办法在第一个查询中加载整个PARENT_TABLE ..
请假设:
答案 0 :(得分:4)
// Annotate ParentTable Persistance class file with a batch Size
@BatchSize(size=100)
class ParentTable{
..
}
@ManyToOne
@JoinColumn(name = "PARENT_ID")
这会将查询数量减少n / 100 + 1。
这个问题的原因是,hibernate将在内部以延迟模式获取数据(我不是在讨论FetchMode.Lazy
)。可以使用FetchMode.SUBSELECT
排除延迟模式,@ManyToOne
仅适用于集合。在batch
时,您可以通过指定batchSize
来选择FetchMode.SUBSELECT
数据。
关于获取初学者的简短描述
FetchMode.SELECT
父查询一个查询,相关表一查询。仅适用 for Collections框架。只有2个查询被解雇。
FetchMode.JOIN
父母的一个查询,儿童的N个查询。
FetchType.Batch
父查询,N查询子查询,但数据库检索 在JOIN中提前进行。
FetchType.EAGER
一次查询父项和n / batchSize + 1次查询。
根据应执行查询的时间,有两种类型的提取。
FetchType.LAZY
:
立即触发查询。
{{1}}:
访问子对象时会触发查询。所以数量 执行的查询将取决于子对象的数量 访问。