2016-11-23 76 views
2

在我們的項目中,我們使用Hibernate,在日誌中,我們觀察到它有時使用Join,有時候選擇關係(因爲我知道它是FetchMode),當我們沒有指定FetchMode時。Hibernate如何決定默認使用哪個FetchMode?

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

有沒有這方面的規範?任何代碼行?任何物品?

+0

http://www.solidsyntax.be/2013/10/17/fetching-collections-hibernate/ – Steephen

+0

有「什麼時候」(懶惰,渴望),有「如何」(選擇,加入等)關於FetchMode。看起來你對「如何」感興趣。嘗試閱讀官方的[文檔](https://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch20.html),這裏有一些關於默認模式的細節 – aUserHimself

回答

3

如果休眠註釋@Fetch上不存在的字段,則該字段的默認FetchMode是:

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

我這個信息源是代碼本身(休眠5.0):HEREHERE,最重要的是,HERE

+0

非常好,我會讓我的回答更清楚。 – Dherik

1

當沒有指定FetchMode並且FetchType爲EAGER時,查看生成的SQL,Hibernate中默認爲JOIN

很遺憾,我在官方文檔中找不到這些信息。

關於使用SELECT即使JOIN是默認的,我認爲這是某些查詢不能在一個單一的查詢來解決,like this

但是,如果你允許B,不含C,休眠只是在它載入B時檢查存在的 C.但是,檢查存在的SELECT只是 效率低下,因爲相同的SELECT可能不僅檢查存在,而且 加載整個對象。所以懶加載消失。

相關問題