最近项目上遇到的一个问题,这里记录一下
一个java映射表实体,其中一个字段在数据库定义的json类型,由于是对象,意味着前端可能会传空值,实体举例:
@Data
@TableName(value = "xxxxx", autoResultMap = true)
public class UcodeBusComponentCol extends BaseEntity {
@ApiModelProperty(value = "链接窗口")
@TableField(value = "link_popup", typeHandler = FastjsonTypeHandler.class)
private LinkPopup linkPopup;
}
这个时候就会出现一个奇怪的现象,就是如果
做任何处理,也就是说变成一个无法修改的状态linkPopup
这个字段如果前端传的
null
或者是不传
linkPopup
这个字段的话,数据库不会对
link_popup
然后做了debug调试,打印SQL语句证实了我的想法,想了半天可能和
这个字段有关系,后来了解到有@TableField策略这个东西,这里把字段追加上去后,解决了问题,如下:@TableField
@ApiModelProperty(value = "链接窗口")
@TableField(value = "link_popup", typeHandler = FastjsonTypeHandler.class, updateStrategy = FieldStrategy.IGNORED)
private LinkPopup linkPopup;
查阅了几篇文章,这里备忘一下
@TableField(value = "name",updateStrategy = FieldStrategy.IGNORED)
private String name;
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
private String sex;
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String addr;
三种更新策略,如上
不管有没有有设置属性,所有的字段都会设置到insert语句中,如果没设置值,全为null,这种在update 操作中会有风险,把有值的更新为nullignored
也是默认策略,也就是忽略null的字段,不忽略""not_null
为null,为空串的忽略,就是如果设置值为null,“”,不会插入数据库。
这样给实体类的属性加上注解not-empty
,每次同步数据的时候打开注解,就不会更新到为null的数据了,项目中在关闭注解。 @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
补充:
值 | 描述 |
---|---|
DEFAULT | 默认不处理 |
INSERT | 插入填充字段 |
UPDATE | 更新填充字段 |
INSERT_UPDATE | 插入和更新填充字段 |