簡體   English   中英

關於hibernate中的fetch策略和fetchtype與fetchmode的關系的一些查詢?

[英]Some queries regarding fetch strategies in hibernate and relation of fetchtype with fetchmode?

我已經通過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”=將其集合分組為子選擇語句。

我的第一個問題是上述哪一個符合eager或lazyloading fetch類型的資格?

為了提出我對hibernate獲取策略的疑問,我正在考慮在我的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。 同意? 現在,如果我在我的遺留項目中查看代碼片段,它會將提取類型稱為渴望和獲取策略,因為select會相互沖突。 對?

另一個問題是在編寫FetchMode時看不到批量大小選項 雖然我看到其他三種獲取策略,但是在eclipse中控制+空間?

Hibernate集合具有獲取類型和獲取模式設置。

Fetch類型指定何時檢索集合的元素,而fetch模式指定Hibernate 如何檢索它們。

所以, FetchMode.SELECTFetchMode.SUBSELECT是法律既FetchType.EAGERFetchType.LAZY 不同之處在於,使用FetchType.EAGER會立即執行其他選擇查詢,而使用FetchType.LAZY則會在首次訪問集合后執行。

FetchMode.JOIN ,但是,沒有任何意義與FetchType.LAZY

批量大小是FetchMode.SELECT的附加優化,因此它應該由它自己的注釋( @BatchSize )配置,並且與FetchMode枚舉本身無關。

也可以看看:

batch-size = N幾乎等於fetch = subselect 讓我解釋一下它是如何做到的:

假設您有10000條父記錄,並且每條記錄中都有500條子記錄,如果您使用提取策略作為子選擇,那么這就是查詢的樣子:

子查詢:
從父母中選擇*;
select * from child where child.Parent_Id in(從Parent中選擇Parent_Id)。

注意:如果IN子句超出了基礎數據庫提供的限制,顯然上述查詢失敗。 這是批量大小進入圖片的情況。 通過使用批量大小,我們可以提到要參與IN子句的Parent_Id的數量。

選擇和批量大小:
從父母中選擇*;
select * from child where child.Parent_Id in(1,2,3,4 ......直到底層數據庫的IN子句限制)。
select * from child where child.Parent_Id in(1001,1002 ......直到底層DB的IN子句限制)。

注意: 批量大小應該與fetch = select一起使用,但不能與fetch = subselect一起使用 (因為它沒有任何意義)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM