Spring-Data-Jpa save: связанные сущности сохраняются как нули, которые не являются - PullRequest
3 голосов
/ 01 июня 2019

У меня есть расписание объекта:

@Entity @Table(name = TableUtils.TIMETABLE)public class Timetable {

private static final long serialVersionUID = -1307879048598194633L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = ColumnUtils.ID)
private long id;

@OneToMany(mappedBy = "timetable", cascade = {CascadeType.REMOVE, CascadeType.PERSIST})
private List<TimetableCell> timetableCells;

public List<TimetableCell> getTimetableCells() {
    return timetableCells;
}

public void setTimetableCells(List<TimetableCell> timetableCells) {
    this.timetableCells = timetableCells;
}
}

и расписание объектаCell:

@Entity
@Table(name = TableUtils.TIMETABLE_CELL)
public class TimetableCell extends AbstractElement {

private static final long serialVersionUID = -8083688091896353882L;

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = ColumnUtils.WEEK_DAY_ID, nullable = false)
private WeekDay weekDay;

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = ColumnUtils.LESSON_HOUR_ID, nullable = false)
private LessonHour lessonHour;

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = ColumnUtils.TIMETABLE_ID, nullable = false)
private Timetable timetable;

...
}

Сначала я создаю ячейки расписания с weekDay и LessonHours. После того, как я настроил этот список на расписание и попытался его сохранить. Но все ячейки расписания сохраняются с нулевым недельным днем ​​и нулевым уроком. Я отладил это. Перед сохранением также устанавливаются все поля.

timetableRepository.save(timetable);

Результат отладки показывает следующее

Ответы [ 2 ]

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

Я удалил Cascade.Persist из полей в TimetableCell. Это работает для меня, но я не знаю, в чем была проблема.

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

1) timetableCells помечены только следующими типами каскадов:

@OneToMany(mappedBy = "timetable", cascade = {CascadeType.REMOVE, CascadeType.PERSIST})

2) В неделях и часах есть только это:

@ManyToOne(cascade = CascadeType.PERSIST)

3) Если вы передадите Timetable для сохранения метода здесь, и он был сохранен ранее:

timetableRepository.save(timetable);

Spring Data JPA будет вызывать не persist, а merge.

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

cascade = {CascadeType.REMOVE, CascadeType.PERSIST, CascadeType.MERGE})
...