Привет всем,
Я обновляю 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 делает правильную вставку.