Spring Boot + Hibernate, неправильный разбор POST-запроса с @RequestBody - PullRequest
1 голос
/ 21 марта 2020

У меня проблема с обработкой входящего запроса POST и добавлением данных в базу данных.

Краткое описание: Существует класс Employer, в котором есть несколько полей, описывающих работодателя, но большинство важно, что у него есть список МНОГИХ объектов класса Offer. Этот класс Offer имеет список МНОГИХ объектов класса Technology.

Моя цель: Я хочу обработать запрос POST (пример запроса POST ниже) и вставить предоставленные данные в базу данных (PostgreSQL).

Пример запроса POST:

{
  "title": "qwe",
  "location": "qwe",
  "description": "qweqwe",
  "technologies": [
    "t1",
    "t2",
    "t3"
  ],
  "experienceLevel": "INTERN"
}

У меня также есть Offer класс:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "offer")
public class Offer {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "offer_id")
  private Long id;

  @ManyToOne
  @JoinColumn(name = "employer_id")
  private Employer employer;

  @OneToMany(
      mappedBy = "offer",
      cascade = {CascadeType.ALL})
  private List<Technology> technologies;

  private String title;
  private String location;
  private String description;
  private ExperienceLevel experienceLevel;

  public void add(Technology technology) {
    if (technologies == null) {
      technologies = new ArrayList<>();
    }
    technologies.add(technology);
    technology.setOffer(this);
  }

  public Offer(String title, String location, String description, ExperienceLevel experienceLevel) {
    this.title = title;
    this.location = location;
    this.description = description;
    this.experienceLevel = experienceLevel;
  }
}

, а также Technology класс:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "technology")
public class Technology {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id")
  private Long id;

  @ManyToOne(
      cascade = {CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH})
  @JoinColumn(name = "offer_id")
  private Offer offer;

  @Column(name = "name")
  private String name;

  public Technology(String name) {
    this.name = name;
  }
}

вместе с Employer класс:

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "employer")
public class Employer {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id")
  private Long id;

  @OneToMany(mappedBy = "employer")
  private List<Offer> offerList;

  @Column(name = "name", unique = true, nullable = false, length = 100)
  private String name;

  @Column(name = "location", nullable = false, length = 100)
  private String location;

  @Column(name = "description")
  private String description;

  @Column(name = "company_size")
  private int companySize;

  public Employer(String name, String location, String description) {
    this.name = name;
    this.location = location;
    this.description = description;
  }

  public Employer(String name, String location, String description, int companySize) {
    this.name = name;
    this.location = location;
    this.description = description;
    this.companySize = companySize;
  }
}

Вот мой OfferController, который должен принимать POST-запрос и помещать все в базу данных:

@RestController
@CrossOrigin(origins = "http://localhost:3000")
public class OfferController {

  private OfferService offerService;

  @Autowired
  public OfferController(OfferService offerService) {
    this.offerService = offerService;
  }

  @GetMapping(value = "offers")
  public List<Offer> getAllEmployers() {
    return offerService.getAllOffers();
  }

  @GetMapping(value = "offers/{id}")
  public Offer getEmployer(@PathVariable long id) {
    return offerService.getOfferById(id);
  }

  @PostMapping(value = "offers", consumes = "application/json")
  public void addOffer(@RequestBody Offer offer) {
    Offer offerWithProperTechnologies = new Offer();
    offerService.saveOffer(offer);
  }

  @PutMapping(value = "offers/{id}")
  public void updateOfferById(Offer offer, @PathVariable Long id) {
    offerService.updateOfferById(offer, id);
  }
}

Основная проблема: Данные как-то неправильно вставляются в базу данных (sample object of Offer is below). Я не знаю, почему данные не вставляются рекурсивно, поэтому они начинаются с нуля -> Сначала создаются технологические объекты (их идентификаторы должны быть установлены на основе стратегии) ​​-> Затем каждой технологии должен быть присвоен соответствующий предложение -> тогда предложение должно иметь присвоенный ему идентификатор, и оно должно быть сохранено в базе данных. (Я передам идентификатор работодателя на более поздней стадии моего проекта, поэтому он свяжет меня с соответствующим работодателем). Что не так с этим кодом? Почему это не работает должным образом? Как правильно вставить эти данные, потому что мне кажется, что мне нужно предложение экземпляра в базе данных, чтобы связать его с технологиями, и наоборот -> Мне нужны технологии, которые существуют в базе данных, чтобы связать их с их предложением. Как это можно сделать одновременно?

Offer(id=null, employer=null, technologies=[Technology(id=null, offer=null, name=t1), Technology(id=null, offer=null, name=t2), Technology(id=null, offer=null, name=t3)], title=qwe, location=qwe, description=qweqwe, experienceLevel=INTERN)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...