我有一个实体时间表:
@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;
}
}
和一个实体 timetableCell:
@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 创建时间表单元格。在我将此列表设置为时间表并尝试保存之后。但是所有时间表单元格都保存为 null weekDay 和 null LessonHour。 我调试了它。在保存之前,所有字段也已设置。
timetableRepository.save(timetable);
调试结果如下
最佳答案
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})
关于java - Spring-Data-Jpa 保存: Related entities saved as null which are not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56405710/