Java 强制在Hibernate中加载所有依赖项
我们的大多数实体都有延迟加载,因为它们不是必需的。 在一个特定的场景中,函数要求它们急切地加载,这超出了事务范围 下面是实现的要点Java 强制在Hibernate中加载所有依赖项,java,entity-framework,hibernate,lazy-loading,eager-loading,Java,Entity Framework,Hibernate,Lazy Loading,Eager Loading,我们的大多数实体都有延迟加载,因为它们不是必需的。 在一个特定的场景中,函数要求它们急切地加载,这超出了事务范围 下面是实现的要点 @Transaction public E getFullyLoadedDetachedEntity(Long id) { E entity = dao.findById(id); Hibernate.initialize(entity); dao.detach(entity); return entity; } 但问题是,实体(E
@Transaction
public E getFullyLoadedDetachedEntity(Long id) {
E entity = dao.findById(id);
Hibernate.initialize(entity);
dao.detach(entity);
return entity;
}
但问题是,实体(E)可能有关联的实体“X”,其中可能有“Y”作为延迟加载。
class E{
X x; //Lazy Load
}
class X{
Y y; //Lazy load
}
现在,Hibernate.initialize(实体)可能只加载它的关联实体(X),而不加载X的关联实体(Y)。
如何在任何级别强制加载所有依赖项/延迟加载对象
更新
不过我试过这个
E entity = dao.findById(id);
Hibernate.initialize(entity);
for (X x : entity.getXList()) {
Hibernate.initialize(x);
}
dao.detach(entity);
在访问X.getY()时,我仍然会遇到懒洋洋的异常情况。只需在更新的代码中再添加一行即可
E entity = dao.findById(id);
Hibernate.initialize(entity);
for (X x : entity.getXList()) {
Hibernate.initialize(x);
Hibernate.initialize(x.getY());
}
dao.detach(entity);
希望这对您有所帮助:)Hibernate.initialize(entitity.getX())
将为该级别执行此操作,但如果您沿着该路径前进,不久您就会将几乎整个数据库拉入内存