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);
}
}
}
网友评论