Skip to content

mybatisplus Column 'xxx' cannot be null

Posted on:August 15, 2023 at 08:17 PM

背景

有下面的表: 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 ) 

相关阅读