【问题标题】:Force Eagerly load all dependencies in Hibernate强制急切加载 Hibernate 中的所有依赖项
【发布时间】:2014-10-30 07:15:30
【问题描述】:

我们的大多数实体都具有延迟加载,因为它们不是必需的。 在一种特定情况下,函数需要它们急切地加载,这超出了事务范围。

这是实现的一点点

@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

【问题讨论】:

  • Hibernate.initialize(entitity.getX()); 会为那个级别做这件事,但如果你沿着这条路走下去,用不了多久你就会将几乎整个数据库拉入内存

标签: java entity-framework hibernate lazy-loading eager-loading


【解决方案1】:

只需在更新后的代码中再添加一行即可。

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

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2014-11-07
    • 2013-07-29
    • 1970-01-01
    • 2014-10-27
    • 2017-08-16
    • 1970-01-01
    相关资源
    最近更新 更多