Spring Boot中如何同时保存Period及关联的新Periodicity实体?
实现方案
1. 定义请求接收DTO
原Period实体没有接收前端传入的TypeOfPeriodicity的字段,先创建一个请求DTO来接收前端参数:
public class CreatePeriodRequest { private DayOfWeek dayOfWeek; private LocalTime startTime; private LocalTime endTime; private TypeOfPeriodicity periodicityType; // 前端传递的周期类型 // 生成getter、setter方法 }
2. 业务层处理关联保存逻辑
在PeriodService中实现保存逻辑,同时创建并关联Periodicity实体:
@Service public class PeriodService { @Autowired private PeriodRepository periodRepository; @Autowired private PeriodicityRepository periodicityRepository; public Period savePeriod(CreatePeriodRequest request) { // 初始化Period实体并赋值 Period period = new Period(); period.setDayOfWeek(request.getDayOfWeek()); period.setStartTime(request.getStartTime()); period.setEndTime(request.getEndTime()); // 创建Periodicity实体,设置前端传入的周期类型和Period的endTime Periodicity periodicity = new Periodicity(); periodicity.setPeriodicityLabel(request.getPeriodicityType()); periodicity.setEndTime(period.getEndTime()); // 维护双向关联:设置Periodicity对应的Period periodicity.setPeriod(period); // 维护Period的关联关系 period.setPeriodicity(periodicity); // 先保存Periodicity,再保存Period periodicityRepository.save(periodicity); return periodRepository.save(period); } }
3. 可选:用JPA级联简化保存操作
如果不想手动调用两个Repository的save方法,修改Period实体的periodicity字段注解,添加级联持久化配置:
@JsonIgnoreProperties(value = { "period" }, allowSetters = true) @OneToOne(cascade = CascadeType.PERSIST) // 添加级联持久化 @JoinColumn(unique = true) private Periodicity periodicity;
业务层代码可简化为:
public Period savePeriod(CreatePeriodRequest request) { Period period = new Period(); period.setDayOfWeek(request.getDayOfWeek()); period.setStartTime(request.getStartTime()); period.setEndTime(request.getEndTime()); Periodicity periodicity = new Periodicity(); periodicity.setPeriodicityLabel(request.getPeriodicityType()); periodicity.setEndTime(period.getEndTime()); periodicity.setPeriod(period); period.setPeriodicity(periodicity); // 保存Period时,自动级联保存关联的Periodicity return periodRepository.save(period); }
4. 控制器层接收前端请求
编写Controller处理前端的创建请求:
@RestController @RequestMapping("/periods") public class PeriodController { @Autowired private PeriodService periodService; @PostMapping public ResponseEntity<Period> createPeriod(@RequestBody CreatePeriodRequest request) { Period savedPeriod = periodService.savePeriod(request); return ResponseEntity.status(HttpStatus.CREATED).body(savedPeriod); } }
内容的提问来源于stack exchange,提问作者Harold-debug
相关产品推荐
相关产品推荐

