Spring Data R2DBC 实体保存后@CreatedBy等创建类审计字段为空问题求助
故障解决指南
核心原因
你自定义实现了Persistable接口后,Spring Data的审计逻辑完全依赖接口中isNew()方法的返回值判断当前操作类型:
isNew()返回true判定为新增操作,会同时填充@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy四类审计字段isNew()返回false判定为更新操作,只会填充@LastModifiedDate、@LastModifiedBy两类审计字段
你遇到的现象就是首次保存实体时isNew()错误返回了false,触发了更新场景的审计逻辑。
具体解决步骤
修正
isNew()方法的判断逻辑
这是最常见的故障点,常规实现应该以主键是否为空作为新增判断标准,示例如下(假设主键字段为id,类型Long):@Override public boolean isNew() { return getId() == null; }如果你使用了雪花ID等提前生成主键的策略,无法通过主键判空判断新增,可以新增临时标记字段辅助判断:
@Transient private boolean isNewFlag; @Override public boolean isNew() { return isNewFlag || getId() == null; } // 新增实体时手动将isNewFlag设为true即可如果是复合主键场景,需要根据所有主键字段是否为默认值判断是否为新实体。
检查审计基础配置
- 确认
BasicEntity类上添加了@EntityListeners(AuditingEntityListener.class)注解,该监听器是触发审计字段自动填充的前提 - 确认启动类/配置类上添加了
@EnableJpaAuditing注解,你已经有更新字段自动填充说明该配置大概率已生效,缺失的话需要补充
- 确认
场景适配排查
如果你使用的是Spring Data JDBC而非JPA,或者配合了其他ORM框架,需要确认对应框架的审计配置适配。另外如果新增场景错误调用了update类方法而非通用save方法,也会被判定为更新操作,调整调用方法即可。
内容的提问来源于stack exchange,提问作者tarmogoyf
相关产品推荐
相关产品推荐

