在数据插入时发现mybatis-plus自动填充失效了,于是就去查询mybatis-plus自动填充的配置
@Slf4j
@Component
public class MetaHandler implements MetaObjectHandler {
/**
* 新增数据执行
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
Subject subject = SecurityUtils.getSubject();
if(subject != null && subject.getPrincipal() != null) {
User userEntity = (User) subject.getPrincipal();
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("createBy", userEntity.getUsername(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
this.setFieldValByName("updateBy", userEntity.getUsername(), metaObject);
}
}
/**
* 更新数据执行
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
Subject subject = SecurityUtils.getSubject();
if(subject != null && subject.getPrincipal() != null) {
User userEntity = (User) subject.getPrincipal();
this.setFieldValByName("updateTime", new Date(), metaObject);
this.setFieldValByName("updateBy", userEntity.getUsername(), metaObject);
}
}
}
发现实现类没错,那么是不是没有把实现类导入到mybatis-plus的全局配置中
@Configuration
@MapperScan({"com.modules.**.dao.mapper"})
public class MybatisPlusConfig {
/**
* 自动填充功能
* @return
*/
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MetaHandler());
return globalConfig;
}
/**
* 分页插件,自动识别数据库类型
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
全局配置中也将MetaHandler添加了
于是去查询实体类是不是字段或者表名写错了
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
@ApiModel("DO父类")
public class BaseEntity implements Serializable {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@TableId(value = "id",type= IdType.AUTO)
@ApiModelProperty(value="id",name="id")
private Long id;
@CreatedBy
@Column(name="create_by")
@TableField(value = "create_by", fill = FieldFill.INSERT)
@Check(name="创建人")
@ApiModelProperty(value="创建人",name="createBy")
private String createBy;
/**
* 创建时间
* 在执行insert语句时候自动插入,jpa审计
*/
@CreatedDate
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name="create_time")
@TableField(value = "create_time", fill = FieldFill.INSERT)
@Check(name="创建时间")
@ApiModelProperty(value="创建时间",name="createTime")
private Date createTime;
/**
* 更新人
* 最后修改人
*/
@LastModifiedBy
@Column(name="update_by")
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) // 新增和更新执行
@Check(name="更新人")
@ApiModelProperty(value="更新人",name="updateBy")
private String updateBy;
/**
* 更新时间
* 最后一次修改时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
@Column(name="update_time")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) // 新增和更新执行
@Check(name="更新时间")
@ApiModelProperty(value="更新时间",name="updateTime")
private Date updateTime;
}
发现字段名和表对于的列名都没错,但是突然发现base类引入了JPA审计的自动填充功能,也就是
@CreatedBy @LastModifiedDate等注释,于是打开debug断点调试,最终发现是mybatis-plus的自动填充与JPA审计的自动填充引起了冲突,于是放弃mybatis-plus的自动填充,使用JPA审计的自动填充
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
@ApiModel("DO父类")
public class BaseEntity implements Serializable {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@TableId(value = "id",type= IdType.AUTO)
@ApiModelProperty(value="id",name="id")
private Long id;
@CreatedBy
@Column(name="create_by")
@TableField(value = "create_by", fill = FieldFill.INSERT)
@Check(name="创建人")
@ApiModelProperty(value="创建人",name="createBy")
private String createBy;
/**
* 创建时间
* 在执行insert语句时候自动插入,jpa审计
*/
@CreatedDate
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name="create_time")
@TableField(value = "create_time", fill = FieldFill.INSERT)
@Check(name="创建时间")
@ApiModelProperty(value="创建时间",name="createTime")
private Date createTime;
/**
* 更新人
* 最后修改人
*/
@LastModifiedBy
@Column(name="update_by")
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) // 新增和更新执行
@Check(name="更新人")
@ApiModelProperty(value="更新人",name="updateBy")
private String updateBy;
/**
* 更新时间
* 最后一次修改时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
@Column(name="update_time")
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) // 新增和更新执行
@Check(name="更新时间")
@ApiModelProperty(value="更新时间",name="updateTime")
private Date updateTime;
/**
* 0是正常 1是删除 -1 是禁用
*/
@Column(name="del_flag")
@TableField(value = "del_flag")
@ApiModelProperty(value="删除标识",name="delFlag")
private Integer delFlag = 0;
@Column(name="system_org_no")
@TableField(value = "system_org_no", fill = FieldFill.INSERT)
@Check(name="事业部编号")
@ApiModelProperty(value="事业部编号",name="orgNo")
private String systemOrgNo;
@Column(name="system_org_name")
@TableField(value = "system_org_name", fill = FieldFill.INSERT)
@Check(name="事业部名称")
@ApiModelProperty(value="事业部名称",name="parentOrgName")
private String systemOrgName;
@PrePersist
public void perPersist() {
Subject subject = SecurityUtils.getSubject();
if (subject != null && subject.isAuthenticated()) {
User principal = (User) subject.getPrincipal();
addOrgInfo(principal);
}
}
//添加登录用户的部门信息
private void addOrgInfo(User principal){
List<Department> departments = principal.getDepartments();
if (departments.size()==1){
this.systemOrgNo =departments.get(0).getOrgNo();
this.systemOrgName = departments.get(0).getOrgName();
}else {
List<String> orgNo = departments.stream().map(Department::getOrgNo).collect(Collectors.toList());
List<String> orgName = departments.stream().map(Department::getOrgName).collect(Collectors.toList());
this.systemOrgNo = JSONObject.toJSONString(orgNo);
this.systemOrgName = JSONObject.toJSONString(orgName);
}
}
}
最后成功填充