首页 > 解决方案 > Spring Boot-键'PRIMARY'的重复条目

问题描述

我是 Spring Boot 的新手。我第一次尝试使用 Postman 通过 JPA 库使用 save() 功能。我的数据库是旧版 Mysql 数据库。一般而言,此表包含已被选入梦幻棒球联盟的棒球运动员的数据。我的表的主键是“play_id”,我还在同一张表中跟踪球员的“mlb_id”(美国职业棒球大联盟的唯一标识符)。

这是我的代码:

Mysql中的表设置:

 CREATE TABLE `mlb_rosters` (
  `play_id` int(10) NOT NULL,
  `mlb_id` int(10) NOT NULL,
  `name_first` varbinary(255) NOT NULL,
  `name_last` varbinary(255) NOT NULL,
  `bats` varchar(1) NOT NULL,
  `throws` varchar(1) NOT NULL,
  `birthday` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `mlb_rosters`
  ADD PRIMARY KEY (`play_id`),
  ADD UNIQUE KEY `mlb_id` (`mlb_id`),
  ADD UNIQUE KEY `mlb_id_2` (`mlb_id`);

ALTER TABLE `mlb_rosters`
  MODIFY `play_id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6730; 

我还为大约 1500 名玩家运行了插入语句,所以这不是一张空白表。

我在 Springboot 中的对象:

package com.example.demo.entities;

import javax.persistence.*;

@Entity
@Table(name="mlb_rosters")
public class IbcMlbPlayer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="play_id", columnDefinition = "int(10)")
    private Integer playId;

    @Column(name="mlb_id")
    private Integer mlbId;

    @Column(name="name_first", columnDefinition = "varbinary(255)")
    private String nameFirst;

    @Column(name="name_last", columnDefinition = "varbinary(255)")
    private String nameLast;

    @Column(name="bats")
    private String bats;

    @Column(name="throws")
    private String thrws;

    @Column(name="birthday")
    private String birthday;

    public IbcMlbPlayer(){

    }

    public Integer getPlayId() {
        return playId;
    }

    public void setPlayId(Integer playId) {
        this.playId = playId;
    }

    public Integer getMlbId() {
        return mlbId;
    }

    public void setMlbId(Integer mlbId) {
        this.mlbId = mlbId;
    }

    public String getNameFirst() {
        return nameFirst;
    }

    public void setNameFirst(String nameFirst) {
        this.nameFirst = nameFirst;
    }

    public String getNameLast() {
        return nameLast;
    }

    public void setNameLast(String nameLast) {
        this.nameLast = nameLast;
    }

    public String getBats() {
        return bats;
    }

    public void setBats(String bats) {
        this.bats = bats;
    }

    public String getThrws() {
        return thrws;
    }

    public void setThrws(String thrws) {
        this.thrws = thrws;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
}

我的控制器的相关路径:

@PostMapping(value = "/saveIbcMlbPlayer")
    public IbcMlbPlayer saveIbcMlbPlayer(@RequestBody IbcMlbPlayer ibcMlbPlayer){
        return ibcMlbPlayerDao.save(ibcMlbPlayer);
    }

我的道:

package com.example.demo.dao;

import com.example.demo.entities.IbcMlbPlayer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface IbcMlbPlayerDao extends JpaRepository<IbcMlbPlayer, Integer> {
}

当我尝试向保存路径发出 Post 请求并传入我尝试创建的播放器的 JSON 对象时,我收到以下错误:

键“P​​RIMARY”的重复条目“25”

在这种情况下,我已经尝试了 25 次,所以 Postman/Spring Boot 不断将“play_id”字段增加 1(每次测试时,错误消息中的这个数字都会增加 1)。

我理解错误,无论出于何种原因,Spring Boot 都没有获得“play_id”字段的最大值,将其加一,然后尝试进行插入。我本来希望“play_id”为 6730,我相信这是该表的最大 play_id 加一。有谁知道如何解决这一问题?任何帮助将非常感激!

标签: mysqlspring-boot

解决方案


AUTO 不应该用作 GenerationType 你必须使用 IDENTITY

@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="play_id", columnDefinition = "int(10)")
private Integer playId;

推荐阅读