我的问题很简单,但是我不知道如何使Hibernate达到我想要的方式:
-表MainTable具有ParentTable(具有100行)的Many-2-One。 MainTable指向ParentTable中100行中的m = 26行
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID")
@Fetch(FetchMode.JOIN)
当我简单地查询“从MainTable”时
它将生成26 + 1查询
当我跟踪查询时,第一个查询仅加载后来的26个查询使用的PARENT_ID。我想它应该有办法在第一个查询中加载整个PARENT_TABLE。
请通过以下假设来提供帮助:
最佳答案
// 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
排除Lazy模式,该模式仅适用于集合。对于@ManyToOne
,您可以通过指定batch
来选择数据的batchSize
。关于获取开始的简短说明
FetchMode.SUBSELECT
FetchMode.SELECT
FetchMode.JOIN
FetchType.Batch
根据应何时执行查询,有两种类型的获取。
FetchType.EAGER
:FetchType.LAZY
:How the Fetch Strategies work is better explained here。
关于Hibernate在多对一中生成m +1个查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11851101/