Что быстрее: 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 шт):

Автор решения: tequillaz

Оба варианта одинаковы по производительности: все данные загрузятся за 1 запрос.

При этом надо понимать, что если сделать FetchType.EAGER, то независимо от того, из какой части системы (приложения) выполняется запрос данных, всегда будет подгружаться один и тот же полный набор данных, а это не всегда требуется, и может приводить к потере производительности в других частях системы.

Собственно, из-за необходимости в разных частях системы делать запрос одной и той же сущности с одновременной загрузкой разных дочерних сущностей с разной глубиной вложенности и появились @EntityGraph.

Используйте @EntityGraph внутри транзакционного метода.

→ Ссылка