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
objectid\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;