当前使用版本(必填,否则不予处理)

3.5.3.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

定义实体对象时候,只使用了注解@TableId,但具体配置type,导致实际使用的是ASSIGN_ID

并且在com.baomidou.mybatisplus.core.MybatisParameterHandler#populateKeys的处理中,简单的把Number类型的生成主键转换成了int,未考虑数据溢出问题。

这里的问题在于:

  1. 全局默认值导致用户容易使用这个默认的算法器
  2. 这个问题发生后较难逆转,如果原业务估算数据量不大,未使用bigint主键,当实际出现这个问题后,只能修改为bigint进行处理
  3. 长久而言,对于初心者,容易忽视主键策略的重要性

重现步骤(如果有就写完整)

SQL定义

CREATE TABLE Entity (
    id INTEGER AUTO_INCREMENT PRIMARY KEY ,
    name TEXT NOT NULL
);

实体定义

@Data
@TableName("entity")
public class Entity {

    @TableId
    private Integer id;

    private String name;
}

测试代码:

for (int i = 0; i < 10000; i++) {
    Entity entity = new Entity();
    entity.setName(i + "");
    LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(2));
    entityMapper.insert(entity);
}

报错信息

org.springframework.dao.DuplicateKeyException:

Error updating database. Cause: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.ENTITY(ID) ( / key:-2061430783 / -2061430783, '85')"; SQL statement:

INSERT INTO entity ( id, name ) VALUES ( ?, ? ) [23505-214]