我有一个spring boot应用程序,其中有两个实体student和Sureler(学生必须学习的一课)。我的实体Student如下所示:
@Column(name = "child_birth_date")
private LocalDate childBirthDate;
@Column(name = "street")
private String street;
@Column(name = "postal")
private Long postal;
@JsonIgnore
@ManyToMany
@JoinTable(
name = "student_sure",
joinColumns = { @JoinColumn(name = "student_id", referencedColumnName = "id") },
inverseJoinColumns = { @JoinColumn(name = "sure_name", referencedColumnName = "name") }
)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BatchSize(size = 20)
private Set<Sureler> listSureler = new HashSet<>();
当然是这样的:
@Column(name = "name")
private String name;
@Column(name = "level")
private Long level;
到目前为止,我可以很好地保存一切。我正在使用这种方法来更新学生的确定(课程)和他或她完成的水平:
@PatchMapping(value = "/students/{id}", consumes = { "application/json", "application/merge-patch+json" })
public ResponseEntity<StudentDTO> partialUpdateStudent(
@PathVariable(value = "id", required = false) final Long id,
@RequestParam String sureName,
@RequestParam Long level
) throws URISyntaxException {
StudentDTO studentDTO = studentService.findOne(id).get();
log.debug("REST request to partial update Student partially : {}, {}", id, studentDTO);
if (id == null) {
throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
}
if (!studentRepository.existsById(id)) {
throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound");
}
Sureler sure = surelerRepository.findByName(sureName).get();
sure.setLevel(level);
SurelerDTO surelerDTO = surelerMapper.toDto(sure);
surelerService.partialUpdate(surelerDTO);
Sureler toSaveInStudent = surelerRepository.findByName(sureName).get();
studentDTO.getListSureler().add(toSaveInStudent);
Optional<StudentDTO> result = studentService.partialUpdate(studentDTO);
return ResponseUtil.wrapOrNotFound(
result,
HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, studentDTO.getId().toString())
);
}
但是我现在的问题是下面的。例如,如果我用级别1的lesson_1更新Student_1,它会毫无问题地保存它,但是如果我用级别2对第二个学生执行相同的过程,则同一课中Student_1的级别也会更改为2。我知道这是因为我将级别直接保存在确定表中,但是我不知道如何修复它。
在这种情况下,你需要改变你的模型。您需要将level属性放在relationship (student_sure)表中,而不是在sure表中。JPA的默认多对多注释无法做到这一点。
这里描述了一个解决方案:https://thorben-janssen . com/hibernate-tip-many-to-many-association-with-additional-attributes/