Cod*_*erZ 6 java model-view-controller spring hibernate jpa
我想从一边删除关系.让我解释.
我基于我的存储库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
}
Run Code Online (Sandbox Code Playgroud)
......和Team实体:
@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
}
Run Code Online (Sandbox Code Playgroud)
因此,Player包含一个关系Team,但Team包含List的Players.
教练可以编辑自己的团队,比如他想要删除Player的Team(关系Team- > Player),而不是失去了Player(因为他与其他表的关系- Events).
总之:Player从正确Team但非LOSE Player对象中
删除.
我怎样才能做到这一点 ?
我尝试:我删除Player的List,但每一次,当我重新加载-他回来......下面的方法显示了如何做到这一点:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当元素被删除时,Player对象id_team仍然是相同的(例如id_team = 2)
谢谢你的所有建议!
您可以通过以下方式更简单地实现此目的:
public void deletePlayerFromTeam(int idPlayer){
Player player = //loadPlayer;
player.setTeam(null);
playerRepository.save(player);
}
Run Code Online (Sandbox Code Playgroud)
您也可以通过将player.team设置为null 并在集合上设置cascade来合并,从而在原始代码中实现此目的:
@OneToMany(mappedBy = "team", fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
private List<Player> playerList;
Run Code Online (Sandbox Code Playgroud)
您应该始终确保关系的两个方面保持一致.
| 归档时间: |
|
| 查看次数: |
1583 次 |
| 最近记录: |