2014-10-30 51 views
0

我們大多數實體都具有延遲加載,因爲它們不是必需的。 在一個特定場景中,函數需要它們急切地加載,這超出了事務範圍。Force急切地加載休眠中的所有依賴

這裏的實施

@Transaction 
public E getFullyLoadedDetachedEntity(Long id) { 
    E entity = dao.findById(id); 
    Hibernate.initialize(entity); 
    dao.detach(entity); 
    return entity; 
} 

的位,但問題是,Entity(E) might have associated entities 'X' which might have 'Y' as lazy loaded.

class E{ 
    X x; //Lazy Load 
} 
class X{ 
    Y y; //Lazy load 
} 

現在,Hibernate.initialize(entity) may be loading only it's associated entities(X) but not the associated entites(Y) of X.

如何強行加載所有依賴/懶加載的對象在任何級別。

更新 我想這一次雖然

E entity = dao.findById(id); 
Hibernate.initialize(entity); 
for (X x : entity.getXList()) { 
    Hibernate.initialize(x); 
} 
dao.detach(entity); 

我仍然在訪問X.getY越來越LazyException()

+0

'同樣,Hibernate.initialize(entitity.getX());'會做的那個水平,但如果你低着頭這條道路,它不會很長在將幾乎整個數據庫拉入內存之前 – JamesENL 2014-10-30 07:31:44

回答

0

只需再行添加到您的更新的代碼。

E entity = dao.findById(id); 
Hibernate.initialize(entity); 
for (X x : entity.getXList()) { 
    Hibernate.initialize(x); 
    Hibernate.initialize(x.getY()); 
} 
dao.detach(entity); 

希望這有助於你:)