8

我的问题很简单,但我不知道如何让 Hibernate 以我想要的方式运行: - 表 MainTable 有 Many-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 是必须的
  • 使用from MainTable mt left join fetch mt.parent parent是可以的,但我们有很多关联
4

1 回答 1

4
 // Annotate ParentTable Persistance class file with a batch Size 
 @BatchSize(size=100)
 class ParentTable{
     ..
 }

@ManyToOne
@JoinColumn(name = "PARENT_ID")

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

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

关于 Fetch Startegies 的简短描述

FetchMode.SUBSELECT

一个查询父表,一个查询相关表。仅适用于 Collections 框架。仅触发了 2 个查询。

FetchMode.SELECT

一次查询父项,N 次查询子项。

FetchMode.JOIN

一个父查询,N 个子查询,但数据库检索在 JOIN 中预先进行。

FetchType.Batch

一个父查询和 n/batchSize + 1 个已触发的查询数。


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

FetchType.EAGER

查询会立即触发。

FetchType.LAZY

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

Fetch Strategies 的工作原理在这里得到了更好的解释

于 2014-08-13T13:48:49.893 回答