Я сталкиваюсь с 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.