【问题标题】:Spring-Data-Jpa save: Related entities saved as null which are notSpring-Data-Jpa 保存:相关实体保存为 null 而不是
【发布时间】:2023-03-04 20:31:01
【问题描述】:

我有一个实体时间表:

@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);

调试结果显示如下

【问题讨论】:

  • 确保设置关系的双方。 stackoverflow.com/questions/48754783/…
  • 我已将时间表设置为每个时间表单元,并将时间表单元列表设置为时间表。但是对于时间表单元格,我只设置了 weekDay 字段,但我没有将 timetableCell 设置为 weekDay。
  • 我尝试在 timetableCell 和 weekDay 之间使用单向关系并再次得到相同的结果。
  • 显示您创建的代码并将列表设置为时间表。

标签: java hibernate spring-data-jpa


【解决方案1】:

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})

【讨论】:

    【解决方案2】:

    我从 TimetableCell 的字段中删除了 Cascade.Persist。它对我有用,但我不知道这是什么问题。

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 2019-09-30
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2018-05-01
      相关资源
      最近更新 更多