我有两个在Spring启动与jhipster第一个生成的实体:
学生:@ Column(name = " child _ birth _ date ")private local date child birth date;
@Column(name = "street")
private String street;
@Column(name = "postal")
private Long postal;
@ManyToMany
@JoinTable(
name = "rel_student__sureler",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "sureler_id")
)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonIgnoreProperties(value = { "students" }, allowSetters = true)
private Set<Sureler> surelers = new HashSet<>();
和Sureler实体:
@Column(name = "name")
private String name;
@Column(name = "student_status")
private String studentStatus;
@ManyToMany(mappedBy = "surelers")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonIgnoreProperties(value = { "surelers" }, allowSetters = true)
private Set<Student> students = new HashSet<>();
现在,我有了以下代码来更新我的学生身份:
@Transactional
@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 String studentStatus
) throws URISyntaxException {
log.debug("REST request to partial update Student partially : {}", id);
// Fetch the student entity from the database
Student student = studentRepository.findById(id)
.orElseThrow(() -> new EntityNotFoundException("Student with id " + id + " not found"));
Sureler sure = surelerRepository.findByName(sureName)
.orElseGet(() -> {
Sureler newSureler = new Sureler();
newSureler.setName(sureName);
return surelerRepository.save(newSureler);
});
student.getSurelers().add(sure);
// Update the necessary fields
student.getSurelers().forEach(sureler -> {
if (sureler.getName().equals(sureName)) {
sureler.setStudentStatus(studentStatus);
}
});
// Save the updated entity using the repository
Student updatedStudent = studentRepository.save(student);
StudentDTO result = studentMapper.toDto(updatedStudent);
return ResponseEntity.ok()
.headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
.body(result);
}
但是这段代码会产生这样的输出:
{
"id": 5,
"parentFirstName": "Avon",
"parentLastName": "Buckinghamshire transmitter",
"parentPhoneNumber": "Steel Triple-buffered Gibraltar",
"parentEmailAdress": "microchip Ruble",
"parentType": "Refined",
"childFirstName": "Alperen",
"childLastName": "Toraman",
"childBirthDate": "2023-02-23",
"street": "Klose Turnpike",
"postal": 64876,
"surelers": [
{
"id": 3,
"name": null,
"studentStatus": null
}
]
}
正如你可以看到surelers列表的名称和学生状态为空,但我不明白为什么,这似乎是由entityManager的合并方法,这是在保存方法(Jparepository)中使用的,至少这是我通过调试得出的结论,但我找不到解决方案。
需要注意的一件事Sureler表的状态可以为null,唯一重要的是更新学生时生成的实例具有状态集。名称存在
可能是懒惰的初始化。默认情况下,多对多关系由 JPA 延迟初始化,因此不会获取 sureler 实体的属性,因此保持 null。尝试在您的存储库中@EntityGraph注释来纠正这一点,以强制急切获取。或自定义查询。
问题解决了,我认为问题出在数据库里,把新的值保存在表中,在把它们添加给学生之前,已经足够了。但是这也带来了另一个问题,我在这个帖子中提到了:如何在jhipster spring boot中正确地保存多对多