java - 无法使用 POSTMAN 删除(映射)我的数据库的对象

标签 java spring hibernate jpa

我有一个名为 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/

相关文章:

java - 替换 ReSTLet 错误页面

java - 未找到提供程序 com.sun.xml.rpc.client.ServiceFactoryImpl

java - ConcurrentHashMap 与并行流删除键

java - 如何在 Caffeine Cache Spring Boot 的 application.properties 层为每个缓存设置不同的规范

java - JPA系统异常访问字段错误

java - 如何读取具有不同规范路径的文件

java - 如何配置 JavaMelody 以监控 C3p0 数据源中的 Jdbc 连接

java - 如何注入(inject) ApplicationContext 本身

java - 为 JPA/Hibernate 提供您自己的提供程序类

mysql - GWT Hibernate 程序 2 中的错误