2011-02-01 129 views
0

我有三個表,休眠懶惰使用用來初始化或急切裝載

users 
user_associations 
association_type. 

支持通過users_associations表關聯到彼此,然後將關聯被賦予一個類型如PARENT,或朋友,等等。

當我打電話給我的視圖時,我有用於表示用戶相互關聯的表數據。在每個列表中,與當前用戶數據,關聯用戶數據和關聯類型列表有關係。

我正在使用Hibernate,並且我在EAGER獲取數據和LAZY加載它之間感到困惑。當我打電話給我的DAO它看起來像這樣

List<UsersAssoc> assoc = (List<UsersAssoc>)session.getNamedQuery("UsersAssoc.getAssoc").setInteger("id", id).list(); 

偷懶負荷工作,我要叫上狀態,Hibernate.initialize所有子對象的

for(UserAssoc a : assoc) { 
      Hibernate.initialize(a.getUser()); 
      Hibernate.initialize(a.getAssocTypes()); 
      Hibernate.initialize(a.getAssociatedUser()); 
    } 

我要指所有的數據在我看來,我試圖做到這一點,而不是將它全部存儲在內存中。哪個選項最好?急切地加載它或在Hibernate中初始化每個類型。這可能不是正確的做法。我需要一些方向。謝謝

回答

0

lazy描述集合是否立即加載 - 所以如果你有lazy = false hibernate默認會在加載父對象時加載集合。它是一個映射屬性。

使用hql時,您的抓取策略會覆蓋您的映射中的設置。從文檔:

「A」fetch「join允許值的關聯或集合與它們的父對象一起使用單個select進行初始化,這在集合的情況下特別有用,它有效地覆蓋了外部聯接以及對關聯和集合的映射文件的惰性聲明,更多信息請參見第19.1節「獲取策略」。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

這是常見的有你所有的映射偷懶假的,但有專門的基於HQL DAO方法,這樣你可以在特定的情況下,具體的方法您的數據得到。

+0

因此,在我的情況下調用Hibernate.initialize的一切都做同樣的事情,只是EAGERLY加載它? @hvgotcodes – JohnnyQuestIsASellOut 2011-02-01 21:34:34