Рассмотрим следующий простой пример:
В одной команде много игроков, и игрок может принадлежать только одной команде.
@Entity
public class Team {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "team")
@Cascade({ org.hibernate.annotations.CascadeType.ALL,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<Player> player = new HashSet<Player>();
}
@Entity
public class Player {
@NotNull
@ManyToOne(targetEntity = Team.class)
@JoinColumn(name = "team_id")
private Team team;
}
То, чего я хочу добиться, - это перевести всех игроков команды А в команду В и впоследствии удалить команду А. Я делаю петлю над игроками из команды A и устанавливаю их команду в команду B (здесь: "this"):
Iterator<Player> iterator = teamA.getPlayer().iterator();
while(iterator.hasNext()){
Player player = iterator.next();
player.setTeam(this);
player.merge();
}
teamA.remove();
После этого выполняется сброс (автозапуск), но я также пытался выполнить сброс до teamA.remove (). Этот код выполняется без ошибок, но после этого игроки из команды A удаляются из моего источника данных из-за каскадной конфигурации, так как teamA.remove () приводит к удалению всех игроков из команды A.
Интересно, почему они все еще связаны с командой A, потому что я также пытался (и проверил в отладчике) удалить всех игроков из набора, поэтому, когда вызывается teamA.remove (), набор пуст. Исключения, выдаваемые в этих случаях, указывали либо: «удаленный объект передан для сохранения», либо «удаленный объект передан для сохранения». Конечно, это работает, если я создаю новый временный проигрыватель, копирую все свойства и .persist ().
Как это сделать, просто «перекомпоновав» отношения?