什么是休眠中的延迟加载?
2022-08-31 06:27:08
Java 中的延迟加载是什么?我不明白这个过程。任何人都可以帮助我了解延迟加载的过程吗?
Java 中的延迟加载是什么?我不明白这个过程。任何人都可以帮助我了解延迟加载的过程吗?
假设您有一个父母,并且该父母有一组孩子。Hibernate现在可以“延迟加载”子级,这意味着在加载父级时,它实际上不会加载所有子级。相反,它会在请求时加载它们。您可以显式请求此操作,或者,这种情况更常见,当您尝试访问孩子时,休眠将自动加载它们。
延迟加载可以帮助显着提高性能,因为通常您不需要子级,因此它们不会被加载。
还要注意n + 1问题。休眠实际上不会加载所有子级,当您访问集合时。相反,它将单独加载每个孩子。循环访问集合时,这会导致对每个子级进行查询。为了避免这种情况,你可以欺骗休眠同时加载所有子项,例如通过调用parent.getChildren().size()。
“延迟加载”意味着只有在您首次实际访问实体时才会加载该实体。
模式是这样的:
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();
}