Поиск JpaRepository с бесконечным циклом левого соединения - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь создать метод для получения объекта из базы данных и загрузки зависимостей.

В обычном случае я никогда не хочу загружать его, поэтому мои два объекта выглядят так:

public class Training implements Serializable {

    [...]

    // Default => LAZY
    @OneToMany(mappedBy = "training")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Video> videoLists = new HashSet<>();

    [...]
}

public class Video implements Serializable {

    [...]

    // Default => EAGER
    @ManyToOne(optional = false)
    @NotNull
    @JsonIgnoreProperties("videos")
    private Training training;

    [...]
}

Чтобы достичь определенной цели, мне нужно загрузить тренировку в активном режиме, поэтому я сделал эту функцию:

@Repository
public interface TrainingRepository extends JpaRepository<Training, Long> {

    @Query("from Training t left join fetch t.videoLists")
    List<Training> findEager();

}

Этот код делает ошибку StackOverflow из-за этой циклической выборки.Каков наилучший способ сохранить выборку EAGER / LAZY при выполнении этой функции?

1 Ответ

1 голос
/ 05 июня 2019

Как правило, загрузка коллекции вместе с каждой записью не рекомендуется. В вашем случае, предположим, что на каждом тренинге есть 100 или более видео, поэтому вы загружаете 100 или более видео вместе с каждым тренингом. Кроме того, у вас нет механизма разбиения на страницы в ваших отношениях, поэтому вы загружаете все видео с каждым тренингом. Это может быть узким местом в вашем приложении. Я думаю, что вы должны изменить свой дизайн, чтобы преодолеть эту проблему, а не менять нетерпеливую / ленивую конфигурацию. Например, вы можете загрузить только тренировку без видео, а в вашем пользовательском интерфейсе, когда пользователь нажимает на тренировку, загружает ее видео.

Но если вы хотите, чтобы этот запрос работал без каких-либо изменений, я думаю, что, возможно, использование fetch = FetchType.LAZY в вашем ManyToOne может решить вашу проблему с переполнением стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...