关于hibernate中的fetch策略和fetchtype与fetchmode的关系的一些查询?

时间:2012-01-23 10:58:45

标签: java hibernate fetching-strategy

我已经通过net上的hibernate获取策略的一些链接。我喜欢的简短而简洁的链接是 http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/。我们有四种类型的获取策略。这些是: -

  1. fetch-“join”=禁用延迟加载,始终加载所有集合和实体。
  2. fetch-“select”(默认)=延迟加载所有集合和实体。
  3. batch-size =“N”=获取“N”个集合或实体,不记录
  4. fetch-“subselect”=将其集合分组为子选择语句。
  5. 我的第一个问题,上述哪一个符合eager或lazyloading fetch类型的资格?

    为了提出我对hibernate fetch策略的疑问,我正在考虑我的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为eager,我只留下连接获取策略但是当我提到fetchtype作为lazyloading时,我有 其他三个选项,即select,batch-size和subselect。同意?现在,如果我查看我的遗留项目中的代码片段,它会将fetch类型称为eager和fetch策略 选择哪个相互缩小。正确?

    当我写FetchMode时,另一个查询我看不到批量大小选项。虽然我看到其他三种获取策略,但是在eclipse中控制+空间?

2 个答案:

答案 0 :(得分:16)

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

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

因此,FetchMode.SELECTFetchMode.SUBSELECTFetchType.EAGERFetchType.LAZY都是合法的。不同之处在于,使用FetchType.EAGER会立即执行其他选择查询,而使用FetchType.LAZY则会在首次访问集合后执行。

然而,

FetchMode.JOINFetchType.LAZY无关。

批量大小是FetchMode.SELECT的附加优化,因此它应该由其自己的注释(@BatchSize)配置,并且与FetchMode枚举本身无关。

另见:

答案 1 :(得分:0)

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

假设您有10000条父记录,并且每条记录中都有500条子记录,如果您将提取策略用作子选择,那么这就是查询的样子:

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

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

选择&amp;批量大小:
从父母中选择*; select * from child where child.Parent_Id in(1,2,3,4 ......直到底层数据库的IN子句限制)。
select * from child where child.Parent_Id in(1001,1002 ......直到底层数据库的IN子句限制)。

注意: fetch = select 应使用批量大小,但 fetch = subselect 则不能(因为它没有任何意义)