提问者:小点点

如何在java Spring Boot中正确保存关系实体


我有两个在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,唯一重要的是更新学生时生成的实例具有状态集。名称存在


共2个答案

匿名用户

可能是懒惰的初始化。默认情况下,多对多关系由 JPA 延迟初始化,因此不会获取 sureler 实体的属性,因此保持 null。尝试在您的存储库中@EntityGraph注释来纠正这一点,以强制急切获取。或自定义查询。

匿名用户

问题解决了,我认为问题出在数据库里,把新的值保存在表中,在把它们添加给学生之前,已经足够了。但是这也带来了另一个问题,我在这个帖子中提到了:如何在jhipster spring boot中正确地保存多对多