繁体   English   中英

如何将 PUT 方法用于深度嵌套的孩子

[英]How to using PUT Method with deep-nested children

目前当我需要在深嵌套子中使用PUT方法时,我先删除当前记录,然后保存新记录,我想知道是否有更适合在深嵌套子中使用PUT方法的方法?

如果是这样,你能告诉我一个示例代码吗?

要求

http://localhost:8080/api/v1/step/3

{
        "name": "Step1 - record 1 change",
        "step2": [
            {
                "name": "Step2 - record 1 change",
                "step3": [
                    {
                        "name": "Step3 - record 1 change",
                        "step4": [
                            {
                                "name": "Step4 - record 1 change"
                            }
                        ]
                    }
                ]
            }
        ]
    }

替换方法

public Step1 replace(Step1Put step1Put, long id) {
        Step1 savedStep1 = findByIdOrBadRequestException(id);
        Step1 step1 = StepMapper.INSTANCE.toStep(step1Put);
        step1.setId(savedStep1.getId());

        //Remove step2 and deep-nested child
        List<Step2> step2List = new ArrayList<>();
        step1.setStep2(step2List);
        step1Rep.save(step1);

        //Add new step2 and deep-nested child
        List<Step2> strStep2 = step1Put.getStep2();
        step2List.addAll(strStep2);
        step1.setStep2(step2List);
        step1.getStep2().forEach((child) -> child.setStep1(step1));
        step1Rep.save(step1);
        return step1;
    }

我的课程

Controller

@RestController
@RequestMapping("api/v1/step")
@RequiredArgsConstructor
public class StepController {

    private final StepService stepService;

    @PostMapping
    public ResponseEntity<Step1> save (@NotNull @Valid @RequestBody Step1Post step1Post) {
        return new ResponseEntity<>(stepService.save(step1Post), HttpStatus.CREATED);
    }

    @PutMapping("/{id}")
    public ResponseEntity<Step1> replace (
            @NotNull @Valid @RequestBody Step1Put step1Put,
            @PathVariable long id
    ) {
        return ResponseEntity.ok(stepService.replace(step1Put, id));
    }

}

服务

@Service
@RequiredArgsConstructor
public class StepService {

    private final Step1Rep step1Rep;    

    public Step1 findByIdOrBadRequestException(long id) {
        return step1Rep.findById(id)
                .orElseThrow(() -> new RuntimeException("Step not found!"));
    }

    @Transactional
    public Step1 save(Step1Post step1Post){
        Step1 step1 = StepMapper.INSTANCE.toStep(step1Post);
        List<Step2> strStep2 = step1Post.getStep2();
        List<Step2> step2List = new ArrayList<>(strStep2);
        step1.setStep2(step2List);
        step1.getStep2().forEach((child) -> child.setStep1(step1));
        return step1Rep.save(step1);
    }

    public Step1 replace(Step1Put step1Put, long id) {
        Step1 savedStep1 = findByIdOrBadRequestException(id);
        Step1 step1 = StepMapper.INSTANCE.toStep(step1Put);
        step1.setId(savedStep1.getId());

        //Remove step2 and deep-nested child
        List<Step2> step2List = new ArrayList<>();
        step1.setStep2(step2List);
        step1Rep.save(step1);

        //Add new step2 and deep-nested child
        List<Step2> strStep2 = step1Put.getStep2();
        step2List.addAll(strStep2);
        step1.setStep2(step2List);
        step1.getStep2().forEach((child) -> child.setStep1(step1));
        step1Rep.save(step1);
        return step1;
    }
}

存储库

public interface Step1Rep extends JpaRepository<Step1, Long> {

}

映射器

@Mapper(componentModel = "spring")
public abstract class StepMapper {

    public static final StepMapper INSTANCE = Mappers.getMapper(StepMapper.class);

    public abstract Step1 toStep(Step1Post step1Post);
    public abstract Step1 toStep(Step1Put step1Put);

}

DTO

Step1发布

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Step1Post {

    private String name;
    private List<Step2> step2 = new ArrayList<>();

}

Step1放

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Step1Put {

    private Long id;
    private String name;
    private List<Step2> step2 = new ArrayList<>();

}

Model

步骤1

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "step1")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Step1 {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @EqualsAndHashCode.Exclude
    @OneToMany(mappedBy = "step1",
            cascade = CascadeType.ALL,
            orphanRemoval = true,
            fetch = FetchType.LAZY)
    @JsonManagedReference
    private List<Step2> step2 = new ArrayList<>();

}

第2步

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "step2")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Step2 {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "step1_id", nullable = false, foreignKey = @ForeignKey(name = "fk_step2_step1"))
    @JsonBackReference
    private Step1 step1;

    private String name;

    @EqualsAndHashCode.Exclude
    @OneToMany(mappedBy = "step2",
            cascade = CascadeType.ALL,
            orphanRemoval = true,
            fetch = FetchType.LAZY)
    @JsonManagedReference
    private List<Step3> step3 = new ArrayList<>();

}

第三步

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "step3")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Step3 {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "step2_id", nullable = false, foreignKey = @ForeignKey(name = "fk_step3_step2"))
    @JsonBackReference
    private Step2 step2;

    private String name;

    @EqualsAndHashCode.Exclude
    @OneToMany(mappedBy = "step3",
            cascade = CascadeType.ALL,
            orphanRemoval = true,
            fetch = FetchType.LAZY)
    @JsonManagedReference
    private List<Step4> step4 = new ArrayList<>();

}

第4步

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "step4")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Step4 {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "step3_id", nullable = false, foreignKey = @ForeignKey(name = "fk_step4_step3"))
    @JsonBackReference
    private Step3 step3;

    private String name;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM