Зачем мне каскад?

У меня есть этот код:

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 вместо одной.

0 ответов

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