Skip to main content

mybatisplus Column 'xxx' cannot be null

· 2 min read

背景

有下面的表: crated_at是自动由mysql填充的,但是使用mybatisplus的BatchSave的时候,发现 Column 'created_at' cannot be null


CREATE TABLE `table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`status` VARCHAR(100) NOT NULL AUTO_INCREMENT COMMENT '状态',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

mybatisplus生成的sql大概是把created_at 也作为sql字段然后拼入

insert into table  (status , created_at,updated_at) values (1 , null ,null) 

也就是没有过滤掉空值

排查原因

一开始找这个文档相关文档 发现加了下面注解 @TableField(insertStrategy = FieldStrategy.IGNORED)

@Data
@TableName("table")
public class TableDO {
/**
* 自增id
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;

/**
* 状态 , WRITE_TO_DB RESUME_FROM_DB
*/
private String status;

/**
* 延迟发送时间
*/
private Date delayAt;

/**
* 创建时间
*/
@TableField(insertStrategy = FieldStrategy.IGNORED) // 没有生效
private Date createdAt;

/**
* 更新时间
*/

private Date updatedAt;


}

发现没有生效 , 然后一直改@TableName , 连这个注解也没有生效,所以发现是整个mybatisplus的注解都没有生效

排查

根据上面现象,再继续排查,发现是idea自动生成的xml优先级更高,有resultMap ,把整个xml清空之后,整个insert正常了,最后sql变成了

insert into table  (status ) values (1 ) 

相关阅读