美文网首页
MetaObjectHandler 更新公共字段

MetaObjectHandler 更新公共字段

作者: 墨色尘埃 | 来源:发表于2020-04-30 10:27 被阅读0次

MetaObjectHandler insertFill未自动插入或者更新公共字段

在公共字段上添加注解@TableField(value = "create_date", fill = FieldFill.INSERT)
或者@TableField(value = "create_date", fill = FieldFill.INSERT_UPDATE)

当某一个类比较特殊,需要更新该字段时,两种方法解决:
第一种:在这个特殊类的字段上不使用该注解@TableField
或者使用@TableField(fill = FieldFill.INSERT),只对新增操作有效果
而不使用@TableField(fill = FieldFill.INSERT_UPDATE)

第二种:在MetaObjectHandler 继承类的重写方法insertFill或者updateFill中,对这个类进行特殊处理

①进到setFieldValByName()方法中发现,通过metaObject.setValue(fieldName, fieldVal);可以得到这个特殊类的object对象

    public MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) {
        if (metaObject.hasSetter(fieldName) && metaObject.hasGetter(fieldName)) {
            metaObject.setValue(fieldName, fieldVal);
        } else if (metaObject.hasGetter(META_OBJ_PREFIX)) {
            Object et = metaObject.getValue(META_OBJ_PREFIX);
            if (et != null) {
                MetaObject etMeta = SystemMetaObject.forObject(et);
                if (etMeta.hasSetter(fieldName)) {
                    etMeta.setValue(fieldName, fieldVal);
                }
            }
        }
        return this;
    }

②根据反射,得到特殊类的object对象的类名,进行比较。再得到属性Field和该属性的值,进行特殊化处理

if (metaObject.hasGetter(META_OBJ_PREFIX)) {
            Object et = metaObject.getValue(META_OBJ_PREFIX);
            if (et != null) {
                Class<?> aClass = et.getClass();
                String etName = aClass.getName();
                String articleName = Article.class.getName();
                if (etName.equals(articleName)) {
                    Field field;
                    Object value = null;
                    try {
                        field = aClass.getDeclaredField("operateTime");
                        field.setAccessible(true);
                        String fieldName = field.getName();
                        value = field.get(et);
                        if (StringUtils.isEmpty(value)) {
                            throw new BusinessException("更新时间为空");
                        }
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    setFieldValByName("operateTime", value, metaObject);
                } else {
                    setFieldValByName("operateTime", new Date(), metaObject);
                }
            }
        }

相关文章

网友评论

      本文标题:MetaObjectHandler 更新公共字段

      本文链接:https://www.haomeiwen.com/subject/uyzawhtx.html