如何解决Repository.save() 不会持久化 CascadeType = all 的实体
我想向我们数据库中的实体添加级联。我添加了@OnetoMany(mappedBy = "exercise",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
到父关系来测试它是如何工作的。
但是,当我保存父实体时,子实体似乎根本没有被保存。
在网上搜索答案时,我发现 session 显然有保存和/或持久化实体的方法。问题是我对会话的工作方式感到完全困惑,并且没有任何尝试成功。我的问题是,级联是否适用于 repository.save()
?如果没有,最好的方法是什么?提前致谢。
父实体:
@Getter
@Setter
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Module {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Builder.Default
@OnetoMany(mappedBy = "module",fetch = FetchType.EAGER,orphanRemoval = true)
@Fetch(value = FetchMode.SUBSELECT)
@JsonBackReference
private List<Exercise> exercises = new ArrayList<>();
public void saveExercise(Exercise exercise) {
int index = exercises.indexOf(exercise);
if (index == -1) {
exercises.add(exercise);
} else {
exercises.set(index,exercise);
}
}
// methods
}
子实体
@Getter
@Setter
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Exercise {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NonNull
@ManyToOne
@JsonManagedReference
private Module module;
// methods
}
模块服务
@Transactional
@Service
public class ModuleService {
public void saveModule(Module module) {
moduleRepository.save(module);
}
}
运动服务:
@Transactional
@Service
public class ExerciseService {
public void saveExercise(Exercise exercise) {
// Get parent in relationship
Module module = exercise.getModule();
// Update parent
module.saveExercise(exercise);
// Save parent
moduleService.saveModule(module);
}
public Exercise getExerciseById(Long exerciseId) {
return exerciseRepository.findById(exerciseId).orElseThrow();
}
}
测试:
@Test
public void testSaveDeleteExercise() {
Exercise exercise = Exercise.builder().id(101L).module(module).build();
exerciseService.saveExercise(exercise);
assertthat(exerciseService.getExerciseById(exercise.getId())).isEqualTo(exercise);
}
例外:
java.util.NoSuchElementException: No value present
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。