gpt4 book ai didi

java - 如何在双向关系中删除一侧的对象?

转载 作者:搜寻专家 更新时间:2023-10-31 19:44:41 27 4
gpt4 key购买 nike

我想从一侧删除关系。让我解释一下。

我的数据库是这样的:enter image description here

我的存储库基于 JPARepository

我有两个实体 TeamPlayer

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 包含 ListPlayers.

教练可以编辑他的球队,例如他想从 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com