2014-10-30 50 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); 

希望这有助于你:)