提问者:小点点

如何在 jhipster Spring靴中正确保存多对多


我有一个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。我知道这是因为我将级别直接保存在确定表中,但是我不知道如何修复它。


共1个答案

匿名用户

在这种情况下,你需要改变你的模型。您需要将level属性放在relationship (student_sure)表中,而不是在sure表中。JPA的默认多对多注释无法做到这一点。

这里描述了一个解决方案:https://thorben-janssen . com/hibernate-tip-many-to-many-association-with-additional-attributes/