簡體   English   中英

Hibernate 如何決定默認使用哪個 FetchMode?

[英]How hibernate decide which of FetchMode use by default?

在我們的項目中,我們使用 Hibernate,並且在日志中我們觀察到,當我們沒有指定 FetchMode 時,它​​有時使用 Join 有時使用 Select 關系(據我所知是 FetchMode)。

如果沒有指定,Hibernate 如何決定使用哪一個 FetchMode?

有沒有這方面的規范? 有幾行代碼? 有文章嗎?

如果字段上不存在 Hibernate 注釋 @Fetch,則該字段的默認 FetchMode 為:

  • 如果此字段具有 FetchType = EAGER,則 FetchMode = JOIN。
  • 否則,FetchMode = SELECT。

我的這些信息的來源是代碼本身(Hibernate 5.0): HEREHERE ,最重要的是HERE

在未指定FetchMode且 FetchType 為EAGER時查看生成的 SQL,在 Hibernate 中默認為JOIN

遺憾的是,我在官方文檔中找不到此信息。

關於SELECT的使用,即使JOIN是默認值,我認為有些查詢無法在單個查詢中解決, 如下所示

但是如果你允許 B 而沒有 C,Hibernate 只需要在它加載 B 的那一刻檢查 C 的存在。但是一個 SELECT 來檢查存在是低效的,因為同一個 SELECT 可能不僅檢查存在,而且加載整個對象。 所以懶加載消失了。

如果一個字段沒有用@Fetch注釋,那么這個字段的默認FetchMode取決於FetchType和查詢是如何完成的:

  • FetchType.LAZY => FetchMode.SELECT
  • FetchType.EAGER :
    • 通過 ID ( Session.get ) => FetchMode.JOIN
    • JPQL 查詢 => FetchMode.SELECT
    • 標准 API 查詢 => FetchMode.SELECT

暫無
暫無

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

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