簡體   English   中英

如何在雙向關系中刪除一側的對象?

[英]How delete object in one side at bidirectional relation?

我想從一邊刪除關系。 讓我解釋。

我的數據庫看起來像這樣: 在此輸入圖像描述

我將我的存儲庫建立在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
    }

......和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刪除PlayerTeam - > 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM