我想从一侧删除关系。让我解释一下。
我的存储库基于 JPARepository
。
我有两个实体 Team
和 Player
。
Player
实体如下所示:
@Entity
@Table(name = "PLAYER")
public class Player implements Serializable, Comparable<Player>{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id_player;
@Size(min=3, max=20)
private String name;
@Size(min=3, max=20)
private String surname;
@Size(min=3, max=20)
private String position;
@Min(value=10)
private int age;
@Min(value=1)
private int number;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_team")
private Team team;
//getters and setters
}
...和团队
实体:
@Entity
@Table(name = "TEAM")
public class Team implements Serializable, Comparable<Team>{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id_team;
@Size(min=4, max=20)
private String name;
@Size(min=4, max=20)
private String city;
private int goals_hit;
private int goals_lost;
private int points;
private int ranked;
@OneToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "id_coach")
private Coach coach;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_stadium")
private Stadium stadium;
@OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
private List<Player> playerList;
@OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
private List<TeamChoosenDate> teamChoosenDateList;
//getters and setters
}
所以 Player
包含一个与 Team
的关系,但是 Team
包含 List
的 Players
.
教练可以编辑他的球队,例如他想从 Team
中删除 Player
(Team
之间的关系 --> Player
) 但不会丢失 Player
(因为他与其他表有关系 - Events
)。
总结:
从正确的 Team
中删除 Player
,但不会丢失 Player
对象。
我该怎么做?
我的尝试:我从 List
中删除了 Player
但每次我重新加载时 - 他都会回来......下面的方法展示了我是如何做到这一点的:
public void deletePlayerFromTeamPlayerList(Long idTeam, int idPlayer){
Team team = teamRepository.findOne(idTeam);
Player playerTmp = playerRepository.findOne( (long) idPlayer);
List<Player> playerList;
int indexOfFindedPLayer;
playerList = team.getPlayerList();
System.out.println("Before Delete: " + playerList.toString());
indexOfFindedPLayer = playerList.indexOf(playerTmp);
if(indexOfFindedPLayer >= 0){
playerList.remove(indexOfFindedPLayer);
System.out.println("After Delete: " + playerList.toString());
team.setPlayerList(playerList);
teamRepository.save(team);
}
}
但是当元素被移除时,Player
对象 id_team
仍然是相同的(例如 id_team = 2)
感谢所有建议!
最佳答案
您可以通过执行以下操作更简单地实现此目的:
public void deletePlayerFromTeam(int idPlayer){
Player player = //loadPlayer;
player.setTeam(null);
playerRepository.save(player);
}
您还可以通过将 player.team 设置为 null and 并在集合上设置级联以合并来在原始代码中实现此目的:
@OneToMany(mappedBy = "team", fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
private List<Player> playerList;
您应该始终确保双方的关系保持一致。
关于java - 如何在双向关系中删除一侧的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34946237/