【发布时间】:2013-06-23 09:53:53
【问题描述】:
我看到很多地方专家开发人员建议延迟加载持久化实体以节省内存。
这个概念很清楚:加载大量你不会使用的信息是无用。
但是,根据我的日常经验,应用此最佳实践并非易事。我的意思是,如果我定义了一个依赖项,假设DEPARTMENT 和EMPLOYEE 之间存在一对多关系,这很可能我需要 在我的业务逻辑中处理Department 时的员工列表。
这件事很常见,我发现自己在大多数情况下都使用 EAGER 加载。
从编程的角度来看,我能做的最好的就是用这样的标志来发送我的 Dao 方法
public Department getDepartment(String departmentName, boolean eagerly)
其中eagerly 属性设置为true 会触发部门的完整加载(默认为延迟加载。我在事务中调用getEmployees() 来加载员工列表)。
你如何处理这个问题?您对 LAZY 加载感到满意吗?如果是这样,我是不是错过了什么?
编辑:
根据@Ayman 的解释,我想讨论以下使用休眠的方法。
public class Node {
private Node parent;
private Set<Node> children;
public getParent(){
if(parent==null)
return Hibernate.initialize(parent);
return parent;
}
public getChildren(){
if(children==null)
return Hibernate.initialize(children);
return children;
}
}
这是一个可接受的实现吗?有什么缺点?
【问题讨论】:
-
我怀疑建议是尽可能使用延迟加载。这并不意味着延迟加载在所有情况下都有用。例如,在交易系统中,您更喜欢预先加载,而不必担心过多的内存成本。例如如今,32 GB 的成本约为 300 美元。
-
认为如果您不使用延迟加载,则对企业列表的查询也会加载其所有部门,这将加载其所有员工的列表,这将加载...不过,决定何时需要进行预先加载取决于问题。
标签: java hibernate lazy-loading