Зачем мне каскад?
У меня есть этот код:
WeeklyOverviewDTO woDTO = woBusiness.saveWithTracker(in.weeklyOverviewDTO...);
in.weeklyOverviewDTO.setWeeklyOverviewTrackerDTOs( woDTO.getWeeklyOverviewTrackerDTOs() );
absenceHistoryBusiness.save( in.weeklyOverviewDTO );
Метод saveWithTracker сохраняет объект WeeklyOverview и объект WeeklyOverviewTracker.
AbensionHistoryBusiness.save сохраняет сущность отсутствие истории, которая выглядит следующим образом:
public class AbsenceHistory {
@ManyToOne( fetch = FetchType.EAGER )
@JoinColumn(name = "weekId", nullable = false )
@ForeignKey(name = "FK_AbsenceHistory_WeeklyOverview")
private WeeklyOverview weeklyOverview;
@OneToOne( fetch = FetchType.EAGER )
@JoinColumn(name = "trackerId", nullable = false )
@ForeignKey(name = "FK_AbsenceHistory_Tracker")
private WeeklyOverviewTracker weeklyOverviewTracker;
...
}
Таким образом, WeeklyOverview и WeeklyOverviewTracker сохраняются до сохранения истории отсутствия. Но я получаю следующее сообщение об ошибке при сохранении сущности отсутствующей истории:
TransientPropertyValueException: свойство Not-null ссылается на временное значение - временный экземпляр должен быть сохранен перед текущей операцией: AbsenceHistory.weeklyOverviewTracker -> WeeklyOverviewTracker
Я знаю, что могу решить это, добавив cascade = {CascadeType.PERSIST, CascadeType.MERGE}
Но зачем здесь каскадирование? WeeklyOverviewTracker уже был сохранен раньше, не так ли?
Что я обнаружил: weeklyOverviewTrackerDTO в отсутствии истории и в еженедельном обзоре - это не один и тот же объект (два разных идентификатора). Но при отладке персистенции AbsenceHistory я вижу сущность WeeklyOverviewTracker с идентификатором, который ранее был сохранен с помощью persist в этом методе -> saveWithTracker(...) Но затем hibernate создает другую запись в БД, и я заканчиваю с 2 записи WeeklyOverviewTracker вместо одной.