2016-08-18 56 views
0
  1. 當我們應該放棄使用FetchType.EAGER時,我們是否有一些規則?JPA:何時在StackOverflowError中提前獲取結果?

  2. 我聽說一些JPA框架(如Hibernate)應該解決循環依賴。

    • 當轉發框架有風險時,我們是否有一些建議?
    • StackOverflowErrorFetchType.EAGER一起總是關於框架中的錯誤(我的意思是如果我有兩個表中的3行)?
+1

所有JPA提供者都應該能夠應付急切的循環關係加載。任何問題都應該意味着你對JPA提供者提出了一個錯誤。 –

+0

@NeilStockton,謝謝!我在這裏引用您的答案:http://stackoverflow.com/a/39015294/3014866 –

回答

1

一個很好的理由,以避免FetchType.EAGER的是,你可以隨時啓動手動渴望獲取的JPQL(與JOIN FETCH),但如果你已經設置FetchType.EAGER您不能啓用懶抓取。

1

熱切的:

  • 方便,但速度緩慢

  • 使用急於當你的父類總是需要爲類。

懶:

  • 更多的編碼,但更高效的

  • 基本上延遲加載比急於替代更多的利益(性能,利用資源)。除非遇到某些問題,否則通常不應將其配置爲提前獲取。

    • 共享一個域實例進行的跨不同的Hibernate Session(例如,把一個領域類實例時到HTTP會話範圍,並從它訪問屬性 - 例如用戶)

    • 當你確定,每次(或大部分時間)訪問一個特定的關係屬性時,當一個實例被提取時,配置這個關係用於提前獲取也是有意義的。

如:人物關係和地址 在這裏,它不是必要的,當我加載Person實體,我需要提取地址的所有的時間,所以你可以繼續懶。

結論

急切抓取策略是一個代碼味道。大多數情況下,爲了簡單起見,不考慮長期性能損失。提取策略決不應該是實體映射責任。每個業務用例都有不同的實體負載需求,因此應該將獲取策略委託給每個單獨的查詢。 全局提取計劃只應該定義LAZY關聯,它是在每個查詢的基礎上獲取的。結合始終檢查生成的查詢策略,基於查詢的提取計劃可以提高應用程序性能並降低維護成本。

+0

感謝您的答案,upvoited!但問題是關於'StackOverflowError'。你甚至沒有提到它。 –

+0

引用你的答案在這裏:http://stackoverflow.com/a/39015294/3014866 –

+0

OK thanx buddy .. – Gokul