什么是休眠中的延迟加载?

2022-08-31 06:27:08

Java 中的延迟加载是什么?我不明白这个过程。任何人都可以帮助我了解延迟加载的过程吗?


答案 1

假设您有一个父母,并且该父母有一组孩子。Hibernate现在可以“延迟加载”子级,这意味着在加载父级时,它实际上不会加载所有子级。相反,它会在请求时加载它们。您可以显式请求此操作,或者,这种情况更常见,当您尝试访问孩子时,休眠将自动加载它们。

延迟加载可以帮助显着提高性能,因为通常您不需要子级,因此它们不会被加载。

还要注意n + 1问题。休眠实际上不会加载所有子级,当您访问集合时。相反,它将单独加载每个孩子。循环访问集合时,这会导致对每个子级进行查询。为了避免这种情况,你可以欺骗休眠同时加载所有子项,例如通过调用parent.getChildren().size()。


答案 2

“延迟加载”意味着只有在您首次实际访问实体时才会加载该实体。

模式是这样的:

public Entity getEntity() {
    if (entity == null) {
        entity = loadEntity();
    }
    return entity;
}

这节省了事先预加载/预填充大型数据集中所有实体的成本,而您实际上并不需要所有这些实体。

在休眠中,您可以配置为懒惰地加载子实体集合。然后,实际的延迟加载在 PersistentSet 的方法中完成,Hibernate 使用“在后台”将实体集合指定为 。Set

例如:

public class Parent {
    private Set<Child> children;

    public Set<Child> getChildren() {
        return children;
    }
}

.

public void doSomething() {
    Set<Child> children = parent.getChildren(); // Still contains nothing.

    // Whenever you call one of the following (indirectly), 
    // Hibernate will start to actually load and fill the set.
    children.size();
    children.iterator();
}

推荐