Пример:
У меня есть объект Person, который имеет отношение ManyToMany к объекту Citizenship.
Лицо лица:
// annotations
@Entity
public class Person {
// ...
@ManyToMany(
fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
)
@JoinTable(
name = "persons_citizenships",
joinColumns = {@JoinColumn(name = "PERSON_ID")},
inverseJoinColumns = {@JoinColumn(name = "CITIZENSHIP_ID")}
)
private Set<Citizenship> citizenships = new HashSet<>();
// ...
// setters and getters
}
И гражданство субъекта:
// annotations
@Entity
public class Citizenship {
@ManyToOne
private Country country;
}
Теперь проблема заключается в следующем: если я получил объект для обновления Person в службе REST и если я получил следующий объект Person, сериализованный из json:
{
"id": 2,
"firstName": "Johnny",
"citizenship": [
{
"id": 2,
"country": {
"id": 128
}
}
]
}
все идет хорошо, и человек обновляется. Но проблема возникает, если кто-то вызвал мою службу, но не предоставил всю информацию для объекта гражданства, например, идентификатор страны. В этом случае, когда JPA объединяет эту организацию, она переходит в гражданство и устанавливает нулевое значение для идентификатора страны, и для меня это большое нет, нет.
Пример JSON для этого случая:
{
"id": 2,
"firstName": "Johnny",
"citizenship": [
{
"id": 2
}
]
}
Что я могу сделать, чтобы сохранить или объединить только RELATIONS , а не сами дочерние объекты. Я имею в виду, что гражданство не меняется, и пользователь моего сервиса не должен менять его через обновление личности. Да, я знаю, что CascadeType.MERGE делает это, но если я удалил его, то даже отношения не сохраняются. Я также не хочу использовать CascadeType.ALL (который включает CascadeType.REMOVE в любом случае, из-за его опасных побочных эффектов, P.S., с которым я столкнулся ранее), если в любом решении это необходимо.
Пожалуйста, предложите что-нибудь для подтверждения этого случая. Это очевидная проблема безопасности для моего приложения, и я не хочу полагаться на намерения пользователя моего сервиса ...