You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:57:18