Как сохранить объекты в весенних данных в ширину вместо глубины?

У меня возникает ошибка StackOverflow при сохранении объекта с большой рекурсивной структурой в Spring Data / Hibernate.

Структура с рекурсией более или менее похожа на:

Schedule -> Contents -> Teachers -> Schedules

В классе расписания есть:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
public List<Content> getContents() {
...
}

Класс содержимого имеет:

@ManyToMany(cascade = CascadeType.ALL)
public List<Teacher> getTeachers() {
 ...
}

А у учителя есть:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn (nullable = true)
public Schedule getSchedule() {
...
}

И для сохранения использую:

this.scheduleRepository.save(schedule);

Где this.scheduleRepository - это CrudRepository.

Когда есть небольшой график, он сохраняется без проблем. Но когда это большой график (с большим количеством учителей, возникает исключение StackOverflow.

Я знаю, что это не бесконечная рекурсия, потому что она не рекурсивна, когда она уже «проверила» элемент, и проблема в том, что у нее так много элементов, что глубина слишком велика для памяти стека.

Я также знаю, что могу увеличить стековую память с помощью -Xss4096k, но я не знаю, насколько большими будут будущие графики. Решение, которое я мог бы сделать, - это вручную сохранить индивидуумов, а затем вручную - глобальный объект (в основном прервать рекурсию и сделать это вручную).

Однако, если Hibernate сохранил его в ширину, а не в глубину, он не будет использовать слишком много памяти стека, поскольку будет только 3 уровня рекурсии. Но я не знаю, возможно ли это.

Итак, мой вопрос в том, можно ли настроить Spring-data / JPA / Hibernate для сохранения каскада объектов в стиле в ширину, а не в глубину.

0
0
88
1

Ответы 1

Я думаю, что ты хочешь

@OneToOne(cascade = CascadeType.MERGE) или @OneToOne(cascade = CascadeType.PERSIST)

Извините, но нет, использование такого каскада - то же самое, если у вас еще нет объекта в базе данных.

PhoneixS 05.11.2018 17:33

Другие вопросы по теме