考虑以下简单示例:
一队有很多球员,而一名球员只能属于一队。

@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团队,然后再删除A团队。我对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团队相关联,因为我也尝试(并在调试器中检查)从Set中删除所有玩家,所以当调用teamA.remove()时,该Set为空。在这些情况下引发的异常要么是“已删除实体传递给持久性”,要么是“已分离实体传递给持久性”。当然,如果我创建了一个新的瞬态播放器,请复制所有属性和.persist()即可。

如何通过简单地“重新链接”关系来做到这一点?

最佳答案

你有没有尝试过:

team2.setPlayers(team1.getPlayers();
team1.setPlayers(null);
for (Player player : team2.getPlayers() {
   player.setTeam(team2);
}

07-28 12:05