Как сопоставить DTO нескольким объектам? - PullRequest
0 голосов
/ 01 февраля 2019

Я пишу Spring-приложение, в котором есть две сущности, которые связаны отношениями один-ко-многим, давайте назовем их матерью и ребенком.

Когда я создаю материнскую сущность с помощью запроса POST, я хочудетская сущность будет создана автоматически.Используя аннотации @OneToMany и @ManyToOne, это работает отлично.По крайней мере, пока я предоставляю информацию о ребенке в Службе Матери.

Вот мой код

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);
   }
}

Ребенок.java

@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 без каких-либо пользовательских методов до сих пор..

Мой POST-запрос похож на (с использованием Почтальона)

{
   "name":"motherName"
}

Теперь создается мама с именем "motherName" и ребенок с именем "Peter".

Моя идея: использование DTO

Теперь я пытаюсь реализовать DTO, который содержит имя матери и имя ребенка, сопоставляет эту информацию в MotherService с сущностями исохраните их через соответствующий репозиторий, чтобы я мог определить оба имени в запросе POST.

motherDto.java

public class mother {
   private String motherName;
   private String kidName;

   //getter, setter

}

Поэтому, когда я POST

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

илиеще лучше

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

мать с именем Сюзанна и ребенок с именем Питер.

Мой вопрос

Как мне сопоставить DTO с двумя объектами?

Или я что-то не так понял?Есть ли более простой способ достичь моей цели?

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

У вас есть 2 способа:

  1. Привязать DTO к сущностям самостоятельно.В этом случае вы должны создать собственный маппер и определить, как именно DTO должен быть преобразован в сущность.Затем просто введите и используйте свой собственный mapper в сервисе.
  2. Используйте одну из существующих библиотек mapper.Например, хорошими кандидатами являются MapStruct и ModelMapper .Вы можете найти примеры использования в соответствующих руководствах по началу работы.
0 голосов
/ 02 августа 2019

Я знаю, что это старое и, вероятно, давно решенное, но позвольте мне предложить другой подход по этому вопросу.

Другой вариант - создать DTO исключительно для создания двух упомянутых вами сущностей.Вы можете назвать это MotherChildCreationDTO или что-то в этом роде, так что имя уже передает его использование и, возможно, создать REST-цель, использующую DTO.

Асимметричные DTO (получение и отправка) являются установленным шаблоном, и DTO тесносвязан с контроллером REST любым способом.

0 голосов
/ 01 февраля 2019

Первое решение:

Вы не можете использовать DTO и отправлять свои JSON с такой же структурой Mother и kids и Jackson в Spring MVCдесериализовать его правильно для вас.

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

Второе решение:

Если вы хотите изменить структуру в JSON и Модели, и вы можете использовать аннотацию Джексона как @JsonProperty или @JsonDeserialize.Прочитайте это как для получения дополнительной информации.

Третье решение:

Вы можете использовать DozzerMapper для сложного сопоставления между вашим DTO и вашимМодель.Вы определяете файл XML для сопоставления каждой модели с DTO, а DozzerMapper сопоставляете ваш DTO с вашими моделями. Для получения дополнительной информации эту ссылку .

...