перемещение объекта в другую коллекцию OneToMany Collection
В моем приложении есть сущность Person, которая имеет множество ролей типа PersonRole.
@Entity
public class Person {
@OneToMany(mappedBy = "person",
cascade=CascadeType.ALL,
orphanRemoval=true,
fetch=FetchType.LAZY)
protected Set<PersonRole> roles;
...
}
@Entity
public abstract class PersonRole {
@ManyToOne
protected Person person;
...
}
Иногда в базе данных встречаются повторяющиеся лица, и я пытаюсь реализовать функцию, объединяющую этих двух людей в одного. Поскольку PersonRole также имеет прикрепленные к нему некоторые разрешения, я не хочу удалять и воссоздавать его, я хочу переместить его от умирающего человека к выжившему человеку:
for (PersonRole role : dieing.getRoles()) {
role.mergeInto(surviving);
}
dieing.getRoles().clear();
Метод в PersonRole выглядит так:
public void mergeInto(Person surviving ) {
this.person = surviving;
surviving.getRoles().add(this);
}
К сожалению, это не работает. Когда я запускаю его, PersonRoles удаляются и не добавляются к выжившему человеку.
Что мне нужно изменить, чтобы они добавлялись и сохранялись через отношения survival.roles?
1 ответ
Я нашел решение:
dieing.getRoles().clear();
был неправ. Я удалил эту строку, и теперь она работает.
Хотя это решение, я не доволен тем, как здесь работает JPA / Hibernate. Выживший Человек «крадет» сущности у «умирающего» Человека без того, чтобы «умирающий» Человек сначала освободил их. Так что, если я не обновляюсь (умираю) после флеша, у меня будет противоречивая модель.