我正在嘗試保留一個鍛煉物件,該物件包含一個練習串列,其中包含一個練習集串列。我得到的錯誤是當我使用 CascadeType.ALL 時,hibernate 嘗試將鍛煉集持久化到資料庫。當我使用 MERGE 時,我沒有收到錯誤訊息,但未將練習集保存到資料庫中。但是鍛煉和鍛煉物件是。
我在這里錯過了什么?我唯一能想到的是我必須將運動物件放在運動集物件中,這最終會導致將它們相互添加的回圈。
物件如下:
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Workout {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
Long workoutId;
@Column
int day;
@Column
String workoutName;
@OneToMany(cascade = CascadeType.ALL,
orphanRemoval = true)
@JoinColumn
List<Exercise> exercises;
@Column
String createDate;
}
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Exercise {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long exerciseId;
@ManyToOne(fetch = FetchType.LAZY)
private Workout workout;
@OneToMany(mappedBy = "exercise",
cascade = CascadeType.ALL)
private List<ExerciseSet> exerciseSets;
@OneToOne(cascade = CascadeType.MERGE)
@JoinTable(name = "var_exercise",
joinColumns =
{ @JoinColumn(name = "exercise_id")},
inverseJoinColumns =
{ @JoinColumn(name = "variation_id" )})
private ExerciseVariations exerciseVariations;
}
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ExerciseSet {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long setId;
@Column
private int setPosition;
@Column
private int reps;
@Column
private int weight;
@ManyToOne
@JoinColumn(name="exerciseId", nullable = false)
private Exercise exercise;
}
我從前端獲取 WorkoutDto 并將其映射到具有映射器的物體,如下所示
@PostMapping("/save")
public void saveWorkout(@RequestBody WorkoutDto workoutDto) {
workoutService.saveWorkout(workoutMapper.toWorkout(workoutDto));
}
public Workout toWorkout(WorkoutDto workoutDto) {
Workout workout = modelMapper.map(workoutDto, Workout.class);
if (workoutDto.getWorkoutId() != null) {
workout.setWorkoutId(workout.getWorkoutId());
}
workout.setWorkoutName(workoutDto.getWorkoutName());
workout.setDay(workoutDto.getDay());
List<Exercise> exerciseList = new ArrayList<>();
for (ExerciseDto exerciseDto: workoutDto.getExercisesDto()) {
List<ExerciseSet> exerciseSets = new ArrayList<>();
for (ExerciseSetDto exerciseSetDto : exerciseDto.getExerciseSetDtoList()) {
ExerciseSet exerciseSet = new ExerciseSet();
exerciseSet.setSetPosition(exerciseSetDto.getSetPosition());
exerciseSet.setReps(exerciseSetDto.getReps());
exerciseSet.setWeight(exerciseSetDto.getWeight());
exerciseSets.add(exerciseSet);
}
Exercise exercise = exerciseMapper.toExercise(exerciseDto);
exercise.setExerciseSets(exerciseSets);
exerciseList.add(exercise);
}
workout.setExercises(exerciseList);
workout.setCreateDate(workoutDto.getCreateDate());
return workout;
}
uj5u.com熱心網友回復:
您沒有在Exercise中設定ExerciseSet,這是管理關系的一方。
您的代碼應如下所示:
public Workout toWorkout(WorkoutDto workoutDto) {
Workout workout = modelMapper.map(workoutDto, Workout.class);
if (workoutDto.getWorkoutId() != null) {
workout.setWorkoutId(workout.getWorkoutId());
}
workout.setWorkoutName(workoutDto.getWorkoutName());
workout.setDay(workoutDto.getDay());
List<Exercise> exerciseList = new ArrayList<>();
for (ExerciseDto exerciseDto: workoutDto.getExercisesDto()) {
Exercise exercise = exerciseMapper.toExercise(exerciseDto);
List<ExerciseSet> exerciseSets = new ArrayList<>();
for (ExerciseSetDto exerciseSetDto : exerciseDto.getExerciseSetDtoList()) {
ExerciseSet exerciseSet = new ExerciseSet();
exerciseSet.setSetPosition(exerciseSetDto.getSetPosition());
exerciseSet.setReps(exerciseSetDto.getReps());
exerciseSet.setWeight(exerciseSetDto.getWeight());
exerciseSet.setExercise(excercise);
exerciseSets.add(exerciseSet);
}
exercise.setExerciseSets(exerciseSets);
exerciseList.add(exercise);
}
workout.setExercises(exerciseList);
workout.setCreateDate(workoutDto.getCreateDate());
return workout;
}
然后你可以設定CascadeType為ALL.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/324666.html
