2011-08-02 50 views

回答

6

即使有可能有一個全球lazy=false(谷歌沒有顯示它,但它可能是可能的),你真的不想這樣做。你真的想爲每個請求加載整個數據庫或重要的對象圖嗎?請記住,hibernate的工作方式,它需要實例化圖中的每個對象。它會變得很慢並且內存密集,並且隨着數據的增長可能會導致應用程序崩潰。

如果您必須加載大量數據,請使用自定義hql查詢,並將所需的字段從表中拉出。避免對象實例化。此外,你可以讓db通過使用view來做很多繁重的工作;即讓db不斷動態更新虛擬表,所以您只需從Web應用程序角度選擇一個表即可。

另一種選擇是重做您的互動,因此您不必首先執行此操作。

+0

有時你不希望延遲加載(例如,在我的多服務器設置)。 – rompetroll

+0

@deadsven:我們通過使用DTO解決了所有這些問題。有一些初步的努力,但最後它試圖序列化服務器對象圖更方便。 –

1

我不知道全局開關。儘管如此,使用註釋控制抓取仍然有效。

@Proxy(lazy = false) 
public class SomeBean { 
... 
    @ManyToOne(fetch = FetchType.EAGER) 
    private OtherBean otherbean; 
... 
} 
1

在HQL中,您需要指定您想要熱切地獲取關聯。

無論如何,正如@hvgotcodes所述,試圖快速獲取所有內容會導致性能問題。嘗試這樣做時,您很可能會發現自己獲取了大部分數據庫。

我建議你閱讀hibernate手冊中的Fetching Strategies以獲得毛茸茸的細節。

5

你可以把它變成休眠映射標籤:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> 

但你不會得到滿意的。

順便說一句:急切的加載和加入抓取是不同的概念!兩者都不是銀子彈,以避免任何問題。

  • 通常使用急切裝載可區分重N + 1個問題
  • 通常使用連接取可能導致結果的重乘法。

在適當的地方使用 - 如果有疑問,請避免使用。


由Ayende Rahien看到這些相關的博客文章:

+0

它是否熱切地獲取整個對象圖?我知道這是一個不好的方法,但我有一個情況,我真的需要它。 – helpermethod

+1

設置lazy = false熱切加載圖形。但是它仍然需要與使用延遲加載和訪問圖中的每個對象相同數量的查詢。 –