У меня есть весенний проект с REST, JPA & HATEOAS, у меня есть UserProfile
сущность с ManyToMany
ассоциацией с Tag
сущностью следующим образом
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_profile_special_case_tag_assoc",
joinColumns = { @JoinColumn(name = "user_profile_id")},
inverseJoinColumns = { @JoinColumn(name = "tag_id")}
)
@RestResource(exported = false)
private Set special_cases = new HashSet();
Если я перечисляю сущность userProfiles через REST, она становится массивом Tag, что и ожидается. * 1007 то есть *
{
"special_cases": []
}
Я также могу вставить или полностью удалить связь с запросом PATCH, т.е. PATCH http://localhost/userProfile/1
{
"special_cases": [
{
"tagId": 1
},
{
"tagId": 2
},
{
"tagId": 3
}
]
}
или полностью удалить ассоциации, т.е. PATCH http://localhost/userProfile/1
{
"special_cases": []
}
Но если я попытаюсь частично изменить ассоциацию, я получу исключение. * 1020 то есть *
{
"special_cases": [
{
"tagId": 2
},
{
"tagId": 3
}
]
}
Но я получаю
{
"timestamp": "2019-06-06T14:29:08.960+0000",
"status": 500,
"error": "Internal Server Error",
"message": "identifier of an instance of Tag was altered from 1 to 2; nested exception is org.hibernate.HibernateException: identifier of an instance of Tag was altered from 1 to 2",
"path": "/userProfiles/1"
}
Насколько я понимаю, Hibernate пытается повторно использовать вложенную сущность Tag для идентификатора 1 и пытается обновить первичный ключ до 2. Поэтому исключение. Как я могу предотвратить это?
Может ли кто-нибудь помочь с ресурсом для реализации частичного изменения связи с REST & HATEOAS весной?
Мне интересно, есть ли способ указать hibernate удалить все ассоциации и повторно вставить их при обновлении.