为什么我需要级联?

时间:2018-08-08 11:05:16

标签: hibernate foreign-keys cascade persist

我有此代码:

WeeklyOverviewDTO woDTO = woBusiness.saveWithTracker(in.weeklyOverviewDTO...);
in.weeklyOverviewDTO.setWeeklyOverviewTrackerDTOs( woDTO.getWeeklyOverviewTrackerDTOs() );
absenceHistoryBusiness.save( in.weeklyOverviewDTO );

saveWithTracker方法保存weeklyOverview和weeklyOverviewTracker实体。

missingHistoryBusiness.save保存一个如下所示的missingHistory实体:

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;
...
}

因此,在不存在missHistory之前,将weeklyOverview和weeklyOverviewTracker保持不变。但是在保存missingHistory实体时收到以下错误消息:

  

TransientPropertyValueException:非null属性引用一个   瞬态值-瞬态实例必须在当前之前保存   操作:AbsenceHistory.weeklyOverviewTracker->   WeeklyOverviewTracker

我知道我可以通过添加cascade = {CascadeType.PERSIST, CascadeType.MERGE}

来解决它

但是为什么这里需要级联? WeeklyOverviewTracker之前已经存在,不是吗?

我发现了什么: missingHistory和weeklyOverview上的weeklyOverviewTrackerDTO不是同一对象(两个不同的ID)。但是在调试AbsenceHistory的持久性时,我看到WeeklyOverviewTracker实体的ID以前是使用该持久性保存在此方法中的-> saveWithTracker(...) 但是随后,hibernate在数据库上创建了另一条记录,最后我得到了2个WeeklyOverviewTracker记录,而不是一个。

0 个答案:

没有答案