5

我已经浏览了一些网络上的休眠获取策略链接。我喜欢的一个简短而简洁的链接是 http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/。我们有四种获取策略。这些都是 :-

  1. fetch-”join” = 禁用延迟加载,始终加载所有集合和实体。
  2. fetch-”select”(默认)=延迟加载所有集合和实体。
  3. batch-size=”N” = 最多获取“N”个集合或实体,不记录
  4. fetch-”subselect” = 将它的集合分组到一个 sub select 语句中。

我的第一个问题是上述哪一个符合 Eager 或lazyloading 获取类型的条件?

为了提出我对休眠获取策略的疑问,我正在考虑在我的 Department 类中使用下面的代码片段

  @OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.EAGER,      orphanRemoval = true)
 @Fetch(value = FetchMode.SELECT)
 @BatchSize(size = 10)
 private Set<EmployeeData> employees = new HashSet<EmployeeData>();

根据我的理解,当我提到 fetchtype 为渴望时,我只剩下加入 fetch 策略,但是当我提到 fetchtype 作为延迟加载时,我还有其他三个选项,即 select、batch-size 和 subselect。同意?现在,如果我在我的一个遗留项目中查看代码片段,它提到 fetch type 为 eager 并且 fetch 策略为 select ,它们相互矛盾。对?

另一个查询是我在编写 FetchMode 时没有看到批量大小选项。尽管我看到其他三种获取策略,但在 Eclipse 中执行控制 + 空间?

4

2 回答 2

16

Hibernate 集合具有获取类型和获取模式设置。

获取类型指定何时检索集合的元素,获取模式指定Hibernate如何检索它们。

所以和 对FetchMode.SELECTFetchMode.SUBSELECT都是合法FetchType.EAGERFetchType.LAZY。不同之处在于,FetchType.EAGER额外的选择查询会立即执行,而FetchType.LAZY它是在第一次访问集合之后执行的。

FetchMode.JOIN,但是,对 . 没有意义FetchType.LAZY

批量大小是对 的额外优化FetchMode.SELECT,因此应该由自己的注解( )配置,与枚举本身@BatchSize无关。FetchMode

也可以看看:

于 2012-01-23T11:39:02.843 回答
0

batch -size=N几乎等于fetch=subselect。让我解释一下它是如何做到的:

假设您有 10000 条父记录,每条记录有 500 条子记录,如果您使用获取策略作为子选择,那么查询将如下所示:

子选择:
从父项中选择*;
select * from child where child.Parent_Id in(select Parent_Id from Parent)。

注意:如果 IN 子句超过了底层数据库提供的限制,显然上述查询会失败。这是批量大小进入图片的情况。通过使用批量大小,我们可以提及参与 IN 子句的 Parent_Id 的数量。

Select & batch-size:
从父节点中选择 *;
select * from child where child.Parent_Id in(1,2,3,4......直到底层数据库的IN子句限制)。
select * from child where child.Parent_Id in(1001,1002......直到底层数据库的IN子句限制)。

注意: batch-size应该与fetch=select一起使用,但不能与fetch=subselect一起使用(因为它没有任何意义)。

于 2015-04-14T18:54:35.217 回答