перемещение объекта в другую коллекцию 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. Выживший Человек «крадет» сущности у «умирающего» Человека без того, чтобы «умирающий» Человек сначала освободил их. Так что, если я не обновляюсь (умираю) после флеша, у меня будет противоречивая модель.

Другие вопросы по тегам