Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何删除双向关系中一侧的对象?_Java_Spring_Hibernate_Jpa_Model View Controller - Fatal编程技术网

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

Java 如何删除双向关系中一侧的对象?,java,spring,hibernate,jpa,model-view-controller,Java,Spring,Hibernate,Jpa,Model View Controller,我想从一侧删除关系。让我解释一下 我的数据库如下所示: 我的存储库基于JPARepository 我有两个实体团队和玩家 Player实体如下所示: @Entity @Table(name = "PLAYER") public class Player implements Serializable, Comparable<Player>{ private static final long serialVersionUID = 1L;

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

我的数据库如下所示:

我的存储库基于
JPARepository

我有两个实体
团队
玩家

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
    }
因此
Player
包含一个与
Team
的关系,但是
Team
包含
玩家的
列表

教练可以编辑他的团队,例如,他希望从
团队
(团队之间的关系
-->
球员)中删除
球员
),但不会丢失
球员
(因为他与其他表-
事件

总之: 从正确的
团队
中删除
玩家
,但不要丢失
玩家
对象

我该怎么做?

我的尝试:我从
列表中删除
玩家
,但每次我重新加载时,他都会回来。。。下面的方法显示了我是如何做到这一点的:

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);
    }
}
public void deletePlayerFromTeamPlayerList(长idTeam,int idPlayer){
teamteam=teamRepository.findOne(idTeam);
Player playerTmp=playerRepository.findOne((长)idPlayer);
列表玩家列表;
int indexoffindeplayer;
playerList=team.getPlayerList();
System.out.println(“删除前:+playerList.toString());
indexoffindeplayer=playerList.indexOf(playerTmp);
如果(indexOffindeplayer>=0){
playerList.remove(indexoffindeplayer);
System.out.println(“删除后:+playerList.toString());
team.setPlayerList(playerList);
teamRepository.save(团队);
}
}
但是当元素被移除时,在
Player
object
id\u team
处仍然是相同的(例如id\u team=2)


谢谢你的建议

您可以通过执行以下操作更简单地实现这一点:

public void deletePlayerFromTeam(int idPlayer){
    Player player = //loadPlayer;
    player.setTeam(null);

    playerRepository.save(player);
}
您还可以在原始代码中通过将player.team设置为null以及将集合上的cascade设置为merge来实现这一点:

@OneToMany(mappedBy = "team", fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
private List<Player> playerList;
@OneToMany(mappedBy=“team”,fetch=FetchType.LAZY,cascade=CascadeType.MERGE)
私人名单玩家名单;

你应该始终确保关系的双方保持一致

使用此方法仅删除一对多或多对一关系中的一方

@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是所有事务所依赖的主要内容。

我正要对这样的内容进行评论。顺便说一句,我想补充一点,数据库模型应该被修改为有一个额外的表/实体来表示玩家/团队之间的关系,因此对于这些类型的事情来说,这会更好。
出现了一个意外错误(type=Internal Server error,status=500)。请求处理失败;嵌套异常为org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[null];嵌套异常为org.hibernate.exception.ConstraintViolationException:无法在控制台执行语句
,原因是:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列“id_team”不能为null
id_team字段类型为
int
,但可能我应该添加一些选项允许该字段为空?是的,您对数据库中的player.id\u团队没有空约束。如果你想留住没有团队的球员,你显然需要删除它。是的,太棒了!:)它工作得很好!我必须只更改显示玩家列表的方法(设置条件为
player.getTeam()!=null
),并且一切正常!谢谢
@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;