mysql - 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 对象时,我收到以下错误:
键“PRIMARY”的重复条目“25”
在这种情况下,我已经尝试了 25 次,所以 Postman/Spring Boot 不断将“play_id”字段增加 1(每次测试时,错误消息中的这个数字都会增加 1)。
我理解错误,无论出于何种原因,Spring Boot 都没有获得“play_id”字段的最大值,将其加一,然后尝试进行插入。我本来希望“play_id”为 6730,我相信这是该表的最大 play_id 加一。有谁知道如何解决这一问题?任何帮助将非常感激!
解决方案
AUTO 不应该用作 GenerationType 你必须使用 IDENTITY
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="play_id", columnDefinition = "int(10)")
private Integer playId;
推荐阅读
- ssh - 通过类似于 noVNC 的 websocket SSH 到后端服务器
- python - 拦截python标准输出并转换为单行
- linux - 通过循环传递参数
- python - 使用flask sql alchemy更新具有原子性的单行
- foreach - 剔除检查表格列中的所有复选框
- javascript - 关于使用 Jquery Ajax 重新加载 div
- openlayers - 获取 OpenLayers 画布的高度
- mysql - 无法在 Centos7 VPS 上安装 Galera Manager GUI
- javascript - 我应该将 useRef refs 还是 ref.current 设置为上下文的一部分?
- haskell - 在递归方案中组成非分布式单子