当前使用版本(必填,否则不予处理)
3.5.3.1
该问题是如何引起的?(确定最新版也有问题再提!!!)
定义实体对象时候,只使用了注解@TableId,但具体配置type,导致实际使用的是ASSIGN_ID
并且在com.baomidou.mybatisplus.core.MybatisParameterHandler#populateKeys的处理中,简单的把Number类型的生成主键转换成了int,未考虑数据溢出问题。
这里的问题在于:
- 全局默认值导致用户容易使用这个默认的算法器
- 这个问题发生后较难逆转,如果原业务估算数据量不大,未使用bigint主键,当实际出现这个问题后,只能修改为bigint进行处理
- 长久而言,对于初心者,容易忽视主键策略的重要性
重现步骤(如果有就写完整)
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]