2013-04-23 40 views
3

爲什麼要使用FetchType.LAZY而不是FetchMode.JOIN而不是FetchType.EAGERFetchType.LAZYFetchMode.JOIN等於Eager模式。這樣對嗎?。爲什麼把Fetchmode.join意味着如果發生任何惰性化異常,那麼我們可以添加fetchmode=join ?.爲什麼不能直接使用fetchtype.Eager。那麼使用fetchtype和fetchmode.join()有什麼好處?爲什麼要用FetchMode.JOIN而不是FetchType.EAGER來使用FetchType.LAZY?

回答

-1

考慮一個具有薪金睡眠列表(加入)的類Employee。 1 EMployee有超過100個薪金睡眠。

你想擁有所有員工的名單(比如1000)。 假設我們只想顯示員工信息(無薪工作)。 但是當我們用Eager模式加載它時,即使所有的薪水都會加載所有員工。這是內存開銷。

+0

但Fetchmode.Join表示不是懶惰的collection.Is是正確的嗎? – tech2504 2013-04-23 19:09:47

1

對於小結果集的數據模型,FetchType.EAGER沒有很大的延遲和內存佔用與FetchMode.JOIN影響。

對於這需要根據具體的技術和環境因素的最佳效率高容量數據集模型,FetchType.LAZY是更加希望的,該連接表指針保持不變 - 但實際結果集保持需求。

例如:在效率和資源利用率方面,與數據集鍵熱切聯繫的房屋對象與熱切地與電話號碼對象連接的區域碼對象是不同的。

如有必要:

  • 使用FetchType.EAGER對於小結果集加入。
  • 並使用FetchType.LAZY用於大型結算加入,效率被認爲是必不可少的。
0

FetchType更適合在實體註釋中使用。大多數時候我會建議你使用lazy加載。

在這種情況下,如果您需要防止LazyIntializationException,您可以通過使用FetchMode.JOIN來請求加載爲eager的條件。

List cats = sess.createCriteria(Cat.class) 
    .add(Restrictions.like("name", "Fritz%")) 
    .setFetchMode("mate", FetchMode.JOIN) 
    .setFetchMode("kittens", FetchMode.JOIN) 
    .list(); 
相關問題