#java #spring-boot #jpa
Вопрос:
Я работаю над проектом системы управления персоналом, и сейчас я внедряю систему резюме, в которую люди могут добавлять свои резюме.
В соответствии с предварительными условиями люди должны иметь возможность добавлять языки,технологии,школы и опыт в свои резюме. Поэтому я создал таблицы для каждого из них, а также таблицу резюме. Я использовал первичный ключ таблицы CV в качестве внешнего ключа в других таблицах.
Я использовал отношения OneToMany, чтобы создать полную сущность резюме. Это работает правильно, когда я просто читаю его, но когда я пытаюсь опубликовать резюме, оно не работает.
Я публикую резюме в этом формате, используя Swagger 2:
{
"coverLetter": "string",
"githubLink": "string",
"id": 0,
"jobseeker": {
"birthOfYear": 0,
"email": "string",
"firstName": "string",
"id": 0,
"jobseekerCvs": [
null
],
"lastName": "string",
"nationalIdentity": "string",
"password": "string",
"verified": true
},
"jobseekerExperiences": [
{
"companyName": "string",
"endYear": 0,
"id": 0,
"position": "string",
"startYear": 0
}
],
"jobseekerLanguages": [
{
"id": 0,
"level": "string",
"name": "string"
}
],
"jobseekerSchools": [
{
"graduateYear": 0,
"id": 0,
"name": "string",
"startYear": 0
}
],
"jobseekerTechnologies": [
{
"id": 0,
"name": "string"
}
],
"linkedinLink": "string"
}
Но я получаю такой результат, когда использую конечную точку GetAll:
"id": 13,
"jobseeker": {
"id": 0,
"email": "string",
"password": "string",
"firstName": "string",
"lastName": "string",
"nationalIdentity": "string",
"birthOfYear": 0,
"verified": false
},
"githubLink": "string",
"linkedinLink": "string",
"coverLetter": "string",
"jobseekerSchools": [],
"jobseekerLanguages": [],
"jobseekerExperiences": [],
"jobseekerTechnologies": []
}
I guess Spring JPA checks the id that come and if there is no entry with that id it just ignores it.
Here is the related classes:
CV Entity Class
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name="jobseeker_cvs")
public class JobseekerCv {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@ManyToOne
@JoinColumn(name="jobseeker_id")
private Jobseeker jobseeker;
@Column(name="github_link")
private String githubLink;
@Column(name="linkedin_link")
private String linkedinLink;
@Column(name="cover_letter")
private String coverLetter;
@OneToMany(mappedBy="jobseekerCv", fetch = FetchType.LAZY)
private List<JobseekerSchool> jobseekerSchools;
@OneToMany(mappedBy="jobseekerCv", fetch = FetchType.LAZY)
private List<JobseekerLanguage> jobseekerLanguages;
@OneToMany(mappedBy="jobseekerCv", fetch = FetchType.LAZY)
private List<JobseekerExperience> jobseekerExperiences;
@OneToMany(mappedBy="jobseekerCv", fetch = FetchType.LAZY)
private List<JobseekerTechnology> jobseekerTechnologies;
}
Experince Class, they all have a same system .
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name="jobseeker_job_experiences")
@JsonIgnoreProperties({"hibernateLazyInitializer","handler","jobseekerCv"})
public class JobseekerExperience {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@ManyToOne
@JoinColumn(name="cv_id")
@JsonProperty(access = com.fasterxml.jackson.annotation.JsonProperty.Access.WRITE_ONLY)
private JobseekerCv jobseekerCv;
@NotNull
@NotBlank
@Column(name="company_name")
private String companyName;
@NotNull
@NotBlank
@Column(name="position")
private String position;
@NotNull
@NotBlank
@Column(name="start_year")
private short startYear;
@Column(name="end_year")
private short endYear;
}
Service method which adds to the database
@Override
public Result add(JobseekerCv jobseekerCv) {
this.jobseekerCvDao.save(jobseekerCv);
return new SuccessResult();
}
Способ управления покоем
@PostMapping("/add")
public ResponseEntity<?> add(@Valid @RequestBody JobseekerCv jobseekerCv) {
return ResponseEntity.ok(this.jobseekerCvService.add(jobseekerCv));
}
Это мой первый вопрос, так что, если что-то не так, извиняюсь. Заранее спасибо.