我有此代码:
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记录,而不是一个。