【发布时间】:2020-05-23 08:49:36
【问题描述】:
我面临 2 个问题:N + 1 查询和内存不足 (OOM)。
我通过分页和延迟加载解决了OOM:
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Set<Employee> employees;
但是当我使用延迟加载时,发生了 N + 1 个查询。所以我尝试使用EntityGraph 作为https://www.baeldung.com/spring-data-jpa-named-entity-graphs。但是作为我的研究和本地测试,EntityGraph 总是对 NamedAttributeNode 字段进行预加载 - 关联字段,我想延迟加载 - 首先不要加载所有数据:
@Entity
@Table(name = "department")
@NamedEntityGraph(name = "Department",
attributeNodes = {
@NamedAttributeNode("employees")
}
)
public class Department implements Serializable {
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Set<Employee> employees;
}
那么有什么方法可以同时获得它们吗?使用EntityGraph 避免 N + 1 和延迟加载以避免 OOM ?
更新:
EntityGraph 可以有效地与 Pageable 一起工作吗?我的意思是不要在 JOIN 查询中加载所有数据。
【问题讨论】:
标签: java spring-boot spring-data-jpa out-of-memory lazy-loading