我已经通过net上的hibernate获取策略的一些链接。我喜欢的简短而简洁的链接是 http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/。我们有四种类型的获取策略。这些是: -
我的第一个问题,上述哪一个符合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中控制+空间?
答案 0 :(得分:16)
Hibernate集合具有获取类型和获取模式设置。
获取类型指定时检索集合的元素,并且获取模式指定 Hibernate如何检索它们。
因此,FetchMode.SELECT
和FetchMode.SUBSELECT
对FetchType.EAGER
和FetchType.LAZY
都是合法的。不同之处在于,使用FetchType.EAGER
会立即执行其他选择查询,而使用FetchType.LAZY
则会在首次访问集合后执行。
FetchMode.JOIN
与FetchType.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 则不能(因为它没有任何意义)