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

时间:2012-08-07 17:30:30

标签: 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)

当我简单地查询“来自MainTable”

它将生成26 + 1个查询

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

请假设:

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

1 个答案:

答案 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}}:

  

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

How the Fetch Strategies work is better explained here