为NamedAttributeNode字段使用带有LAZY加载模式的Spring数据JPA EntityGraph

问题描述 投票:0回答:1

我面临两个问题: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字段-关联字段,我想将其延迟加载:

@NamedEntityGraph(name = "Department",
        attributeNodes = {
                @NamedAttributeNode("employees")
})

所以有什么办法可以同时获得它们吗?使用EntityGraph避免N + 1,并使用延迟加载以避免OOM?

java spring-boot spring-data-jpa out-of-memory lazy-loading
1个回答
0
投票

使用EntityGraph,您的所有NamedAttributeNode关联都将在带有Join子句的1个查询中加载。启用sql日志以查看hibernate在不同情况下用于加载实体的查询数量

logging.level.org.hibernate.SQL=DEBUG

[您将看到使用@OneToMany(fetch = FetchType.EAGER)不使用EntityGraph会为每个雇员单独分隔select,但是使用EntityGraph只会执行1个“选择”>

也不要忘记在存储库中指定实体图名称,例如:

@EntityGraph(value = "Department")
List<Department> findAll();
© www.soinside.com 2019 - 2024. All rights reserved.