Spring Boot - сначала удалить при обновлении - PullRequest
0 голосов
/ 07 апреля 2020

Привет всем,

Я обновляю CourseEntity контроллером отдыха, используя следующую команду: JSON:

{
  "id": 95,
  "name": "Course ABC",
  "registrations": [
    {
      "id": 180,
      "student": {
        "id": 23,
        "name": "João da Silva",
      }
    },
    {
      "id": 181,
      "student": {
        "id": 24,
        "name": "Maria Joaquina",
      }
    }
  ]
}

Но в некоторых моментах мне нужно удалить сохраненную CourseRegistration, и я могу добавить опять та же регистрация курса, теперь не сохранилась. Затем мой JSON изменяется на:

{
  "id": 95,
  "name": "Course XPTO",
  "registrations": [
    {
      "id": 180,
      "student": {
        "id": 23,
        "name": "João da Silva",
      }
    },
    {
      "id": null,
      "student": {
        "id": 24,
        "name": "Maria Joaquina",
      }
    }
  ]
}

. Обратите внимание, что JSON теперь имеет CourseRegistration без идентификатора, такую ​​же CourseRegistration, но без идентификатора. Поскольку во внешнем интерфейсе пользователь удаляет и снова добавляет того же студента

Когда я сохраняю CourseEntity, JPA сначала пытается вставить, и я получил ошибку об уникальном индексе ограничений на полях CourseRegistration. Ожидаемым поведением было удаление сохраненной CourseRegistration и сохранение той же CourseRegistration, но новой CourseRegistration.

Ниже созданных классов:

@Entity
class Course {

    @Id
    private Long id;

    private String name;

    @OneToMany(mappedBy = "courses", fetch = FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval = true)
    @JsonManagedReference(value = "course") 
    private Set<CourseRegistration> registrations;

    // getters, setters, equals and hashcode by id
}

@Entity
class Student {

    @Id
    private Long id;

    private String name;

    @OneToMany(mappedBy = "student")
    private Set<CourseRegistration> registrations;

    // getters, setters, equals and hashcode by id
}

@Entity
@Table(name = "COURSEREGISTRATION", uniqueConstraints = {
        @UniqueConstraint(columnNames = {"student_id","course_id"})
})
class CourseRegistration {

    @Id
    private Long id;

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "student_id")
    @JsonBackReference(value="course")
    private Student student;

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "course_id")
    private Course course;

    // getters, setters, equals and hashcode by student and course
}

Другие правильные поведения:

  • Когда я удаляю постоянную CourseRegistration из Set, JPA делает правильное исключение.
  • Когда я ставлю новую непостоянную и другую CourseRegistration в Set, JPA делает правильную вставку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...