[英]How to make a one-to-many bidirectional relation with JPA annotations, where the collection side owns it
[英]How delete object in one side at bidirectional relation?
我想從一邊刪除關系。 讓我解釋。
我將我的存儲庫建立在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
}
......和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
}
因此, Player
包含與Team
一個關系,但Team
包含一個Players
List
。
教練可以編輯他的團隊,例如他想要從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 並在集合上設置cascade來合並,從而在原始代碼中實現此目的:
@OneToMany(mappedBy = "team", fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
private List<Player> playerList;
您應該始終確保關系的兩個方面保持一致。
使用此方法僅刪除一對多或多對一關系中的一側。
@ManyToOne(cascade=CascadeType.PERSIST, fetch = FetchType.LAZY)
// @JoinColumn(name = "qid")
@JoinColumn(name = "qid", referencedColumnName = "qid", foreignKey = @ForeignKey(name = "qid"), nullable = false)
// @JsonIgnore
@JsonBackReference
private QueueGroup queueGroup;
這里CascadeType是所有事務所依賴的主要內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.