Что быстрее: EntityGraph или работа в транзакции?
Приложение на Spring Data, JPA, Hibernate. В приложении есть много сущностей с большой вложенностью. Например:
// первая сущность
@Entity
public class First {
@OneToMany
private Set<Second> seconds;
}
// вторая сущность
@Entity
public class Second {
@ManyToOne
private First first;
@OneToOne
private Third third;
}
// третья сущность
@Entity
public class Third {
@OneToOne
private Second second;
}
Теперь для First мне надо сделать DTO, в котором будут участвовать все вложенные классы. Я не хочу использовать FetchType.EAGER. Я могу использовать @EntityGraph, чтобы загрузить весь граф за раз, а могу вытаскивать нужные мне части графа в методе отмеченном @Transactional.
Допустим, в каждом случае я буду вытаскивать один и тот же граф. Какой способ будет более производительным?
Ответы (1 шт):
Оба варианта одинаковы по производительности: все данные загрузятся за 1 запрос.
При этом надо понимать, что если сделать FetchType.EAGER, то независимо от того, из какой части системы (приложения) выполняется запрос данных, всегда будет подгружаться один и тот же полный набор данных, а это не всегда требуется, и может приводить к потере производительности в других частях системы.
Собственно, из-за необходимости в разных частях системы делать запрос одной и той же сущности с одновременной загрузкой разных дочерних сущностей с разной глубиной вложенности и появились @EntityGraph.
Используйте @EntityGraph внутри транзакционного метода.