У меня проблема с обработкой входящего запроса 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)