代码之家  ›  专栏  ›  技术社区  ›  Chris

如何将DTO映射到多个实体?

  •  0
  • Chris  · 技术社区  · 6 年前

    当我通过POST请求创建一个母实体时,我希望自动创建一个子实体。使用@OneToMany和@ManyToOne注释,效果很好。至少,只要我在MotherService中提供孩子的信息。

    Mother.java

    @Entity
    @Table(name="mother")
    public class Mother{
       @Id
       @Column(name="id", updatable = false, nullable = false)
       private Long id;
    
       @Column(name="name")
       private String name;
    
       @OneToMany(mappedBy = "mother", cascade = CascadeType.ALL, orphanRemoval = true)
       private List<Kid> kidList = new ArrayList<>();
    
       //constructor, getter, setter
    
       private void addKid(Kid kid) {
          this.kidList.add(kid);
          kid.setMother(this);
       }
    }
    

    @Entity
    @Table(name="kid")
    public class Kid{
       @Id
       @Column(name="id", updatable = false, nullable = false)
       private Long id;
    
       @Column(name="name")
       private String name;
    
       @ManyToOne(fetch = FetchType.LAZY)
       @JoinColumn(name = "mother_id", nullable=false)
       private Mother mother;
    
       //constructor, getter, setter
    }
    

    MotherController.java

    @RestController
    @RequestMapping("mothers")
    public class MotherController {
    
       @Autowired
       private MotherService motherService;
    
       MotherController(MotherService motherService) {
           this.motherService = motherService;
       } 
    
       @PostMapping
       Mother createMother(@RequestBody Mother mother)  {
           return this.motherService.createMother(mother);
       }
    }
    

    MotherService.java

    @Service
    public class MotherService {
    
       private MotherRepository motherRepository;
    
       @Autowired
       public MotherService (MotherRepository motherRepository) {
           super();
           this.motherRepository= motherRepository;
       }
    
       public Mother createMother(Mother mother)  {
    
           Kid kid = new Kid("Peter");
    
           mother.addKid(kid);
    
           return this.motherRepository.save(mother);
       }
    }
    

    母亲和孩子的存储库扩展了JpaRepository,到目前为止没有任何自定义方法。

    我的发帖请求类似(使用邮递员)

    {
       "name":"motherName"
    }
    

    现在一个母亲的名字是“motherName”,一个孩子的名字是“Peter”。

    我的想法:使用DTO

    我现在尝试实现一个DTO,它包含母亲的名字和孩子的名字,将母亲服务中的信息映射到实体,并通过相应的存储库保存它们,这样我就可以在POST请求中定义这两个名字。

    motherDto.java

    public class mother {
       private String motherName;
       private String kidName;
    
       //getter, setter
    
    }
    

    {
      "motherName":"Susanne",
      "kidName":"Peter"
    }
    

    甚至更好

    {
       "mother": {
           "name":"Susanne"
       },
       "kid": {
           "name":"Peter"
       }
    }
    

    一个名叫苏珊娜的母亲和一个名叫彼得的孩子被创造出来。

    我的问题是

    还是我做的不对?有没有更简单的方法来实现我的目标?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Aarkon    5 年前

    我知道这个问题由来已久,可能早已解决,但让我对这个问题提出不同的看法。

    不对称DTO(接收和发送)是一种既定模式,DTO以任何方式与REST控制器紧密耦合。

        2
  •  2
  •   Javad Kargar    6 年前

    第一个解决方案:

    您不能使用DTO发送您的 JSON Mother kids Jackson 在里面 Spring MVC 为您正确地反序列化它。

    {
     id:2,
     name:'sarah'
     kidList:[{id:546,name:'bob'},{id:478,name:'tom'}]
    }
    

    第二种解决方案:

    如果你想在不同的结构 JSON @JsonProperty @JsonDeserialize . 阅读 this like 了解更多信息。

    你可以用 DozzerMapper DTO 还有你的模特。您可以定义XML文件,用于将每个模型映射到 DTO 打瞌睡的人 DTO 给你的模特们读一读 this link

        3
  •  1
  •   Oleksii Zghurskyi    6 年前

    你有两种方法:

    1. 使用现有的映射程序库之一。例如,好的候选人是 MapStruct ModelMapper . 您可以在相应的入门指南中找到使用示例。