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

标签 java spring hibernate jpa model-view-controller

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

我的数据库是这样的: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/

相关文章:

java - 如何远程检索 java 线程转储

java - 在完成授权之前,用户必须通过 Spring Security 进行身份验证

java - 我如何使用 spring aop 编写日志记录测试?

java - Spring MVC 3 - @ResponseBody 方法如何呈现 JSTLView?

java - 在 hibernate 中插入实体问题

java 将 GB、Mb、KB 和字节精确转换为 double

java - 哪个是 Spring 框架的最佳 Java IDE?

java - 在没有运行定位器的情况下启动 spring-data-gemfire

java - Hibernate:将次要对象封装在映射对象中

java - 如何使用 Hibernate Projection 检索复杂类及其成员?