使用mybatis plus自动填充时间出现问题

使用mybatis plus自动填充时间出现问题,第1张

使用mybatis plus自动填充时间出现问题

配置好mybatis plus的自动填充时间后,进行更新 *** 作时出现了以下异常:

org.springframework.dao.DataIntegrityViolationException: 
### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'gmt_modified' cannot be null
### The error may exist in com/ylz/druglist/dao/DrugNameReplaceDao.java (best guess)
### The error may involve com.ylz.druglist.dao.DrugNameReplaceDao.updateById-Inline
### The error occurred while setting parameters
### SQL: UPDATE drug_name_replace  SET original_value=?, replace_value=?, operator_ip=?,   gmt_modified=?  WHERe id=?   AND deleted=0
### Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'gmt_modified' cannot be null
; Column 'gmt_modified' cannot be null; nested exception is java.sql.SQLIntegrityConstraintViolationException: Column 'gmt_modified' cannot be null

异常的信息为:进行更新的时候,gmt_modified 字段为空,无法进行修改 *** 作。

对于mybatis plus的自动填充时间配置过程如下:
配置实体类:

@Data
@TableName(value = "drug_name_replace")
public class DrugNameReplaceDO {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String originalValue;
    private String replacevalue;
    private String operatorIp;
    @Version
    private Integer version;
    @TableLogic
    private Integer deleted;

    @TableField(value = "gmt_create", fill = FieldFill.INSERT)
    private Date gmtCreate;

    @TableField(value = "gmt_modified", fill = FieldFill.INSERT_UPDATE)
    private Date gmtModified;
}

时间填充处理器如下

@Component
public class MybatisPlusmetaObjectHandler implements metaObjectHandler {

    private final String GMT_CREATE = "gmt_create";
    private final String GMT_MODIFIED = "gmt_modified";

    @Override
    public void insertFill(metaObject metaObject) {
        Date date = new Date();
        this.setFieldValByName(GMT_CREATE, date, metaObject);
        this.setFieldValByName(GMT_MODIFIED, date, metaObject);
    }

    @Override
    public void updateFill(metaObject metaObject) {
        Date date = new Date();
        this.setFieldValByName(GMT_MODIFIED, date, metaObject);
    }
}

执行更新的 *** 作代码如下:

	DrugNameReplaceDO drugNameReplaceDO = new DrugNameReplaceDO();
	drugNameReplaceDO.setId(1);
	drugNameReplaceDO.setOriginalValue("甲");
	drugNameReplaceDO.setReplacevalue("乙");
	drugNameReplaceDO.setOperatorIp("123456789");
	int i = drugNameReplaceDao.updateById(drugNameReplaceDO);

再三检查之后确认自己的代码是没有出错的,而且在处理器中进行日志记录发现传入的也是有数据的。

后面经过debug检查,在这段代码中发现

public boolean hasSetter(String propertyName) {
        return this.setMethods.containsKey(propertyName);
}

代码在检查是否实体类中有该属性的setter方法的判断中,获取到的实体类的属性如下

其中对应的修改时间字段为 gmtModifired 。
而我传入的时间修改字段名称为

在该判断逻辑中,系统认为我没有传入对应时间修改的字段,从而在该设置值的代码中直接跳过了设置值的代码

default metaObjectHandler setFieldValByName(String fieldName, Object fieldVal, metaObject metaObject) {
    if (Objects.nonNull(fieldVal) && metaObject.hasSetter(fieldName)) {
        metaObject.setValue(fieldName, fieldVal);
    }

    return this;
}

由于 metaObject.hasSetter(fieldName) 为false,所以跳过了 metaObject.setValue(fieldName, fieldVal);导致我设置的值。

所以只需要修改传入修改时间对应的字段就可以了。
将新增时间和修改时间对应的字段修改为驼峰形式,如下

private final String GMT_CREATE = "gmtCreate";
private final String GMT_MODIFIED = "gmtModified";

重新运行测试代码,测试成功。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5708943.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存