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

Cod*_*erZ 6 java model-view-controller spring hibernate jpa

我想从一边删除关系.让我解释.

我的数据库看起来像这样:在此输入图像描述

我基于我的存储库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
    }
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包含ListPlayers.

教练可以编辑自己的团队,比如他想要删除PlayerTeam(关系Team- > Player),而不是失去了Player(因为他与其他表的关系- Events).

总之:Player从正确Team但非LOSE Player对象中 删除.

我怎样才能做到这一点 ?

我尝试:我删除PlayerList,但每一次,当我重新加载-他回来......下面的方法显示了如何做到这一点:

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)

谢谢你的所有建议!

Ala*_*Hay 8

您可以通过以下方式更简单地实现此目的:

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)

您应该始终确保关系的两个方面保持一致.

  • 我正要评论这样的事情.顺便说一句,我想补充一点,数据库模型应该改为有一个额外的表/实体来表示玩家/团队之间的关系,所以这对于这些类型的东西会好得多. (3认同)