我有一个名为 Player 的实体和另一个名为 Game 的实体,每个玩家都有 X 个游戏,因此 Games 有一个 idPlayer 的外键。
我试图从逻辑上删除一个玩家及其所有 GamesTries,并且 spring 说“java.sql.SQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(dices
.游戏
,约束FKss1l3mwkp44i09b7j2rolnyp5
外键(player_id_player
)引用玩家
(id_player
))“, POSTMAN 通过 JSON 表示:“message”:“无法执行语句;SQL [n/a];约束 [null];嵌套异常是 org.hibernate.exception.ConstraintViolationException:无法执行语句”。
这是两个实体的代码:
@Entity
@Table(name="player")
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JoinColumn(name = "id_player")
private Integer idPlayer;
private String name;
private LocalDateTime registerDate;
private float successRate;
public Player() {
}
public Player(Integer idPlayer, String name, LocalDateTime registerDate, float successRate) {
this.idPlayer = idPlayer;
this.name = name;
this.registerDate = registerDate;
this.successRate = successRate;
}
//getters n setters
}
@Entity
@Table(name = "game")
public class Game {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JoinColumn(name = "id_game")
private Integer idGame;
@JoinColumn(name = "id_player")
private Integer idPlayer;
private Integer valueDice1;
private Integer valueDice2;
private boolean won;
public Game() {
}
public Game(Integer idGame, Integer idPlayer, Integer valueDice1, Integer valueDice2, boolean won) {
super();
this.idGame = idGame;
this.idPlayer = idPlayer;
this.valueDice1 = valueDice1;
this.valueDice2 = valueDice2;
this.won = won;
}
//getters n setters
}
然后是玩家 Controller 和玩家服务
//CONTROLLER
@DeleteMapping("dices/players/id")
public void deletePlayerById(@RequestBody Player player){
playerService.deletePlayerById(player.getId());
}
//SERVICE
@Transactional
public void deletePlayerById(Integer id) {
gameRepository.deleteByIdPlayer(id);
playerRepository.deleteById(id);
}
非常感谢你们!!
最佳答案
如果您想在游戏中拥有玩家外键,只需添加@ManyToOne RelationShip:
@Entity
@Table(name="player")
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer idPlayer;
private String name;
private LocalDateTime registerDate;
private float successRate;
public Player() {
}
public Player(Integer idPlayer, String name, LocalDateTime registerDate, float successRate) {
this.idPlayer = idPlayer;
this.name = name;
this.registerDate = registerDate;
this.successRate = successRate;
}
//getters n setters
}
对于游戏,你可以这样:
@Entity
@Table(name = "game")
public class Game {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer idGame;
@ManyToOne
@JoinColumn(name="player_id", nullable=false)
@OnDelete(action = OnDeleteAction.CASCADE)
private Player player;
private Integer valueDice1;
private Integer valueDice2;
private boolean won;
public Game() {
}
public Game(Integer idGame, Integer idPlayer, Integer valueDice1, Integer valueDice2, boolean won) {
super();
this.idGame = idGame;
this.idPlayer = idPlayer;
this.valueDice1 = valueDice1;
this.valueDice2 = valueDice2;
this.won = won;
}
//getters n setters
}
所以现在如果您删除播放器,OnDelete 注释将删除孤儿游戏以及您的播放器。我不知道你为什么这样尝试 JoinColumn 。值得注意的是,您也可以将其建模为双向,并使用设置为 true 的孤立删除功能。您可以阅读更多内容 here
关于java - 无法使用 POSTMAN 删除(映射)我的数据库的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61170497/