MongoDB新增时createdDate正常更新返回null,实现Persistable仍未解决
问题原因与解决方案
核心原因
@CreatedDate是Spring Data MongoDB的审计字段,仅会在判定实体为全新实例时自动填充值,更新操作默认不会维护该字段,你遇到的空值问题本质是更新操作时用null覆盖了数据库中原本的createdDate值。
具体解决方案
- 首先确认项目配置类/启动类上已添加
@EnableMongoAuditing注解,审计功能是所有自动日期填充的前提,新增时如果是手动赋值了createdDate会掩盖审计未开启的问题,更新时就会暴露空值异常。 - 避免使用「新建实体对象→设置id和要更新的字段→直接调用save」的更新逻辑:该场景下新建对象的createdDate默认是null,Spring Data因为id不为空判定不是新实例,不会自动补全createdDate,会直接把null写入数据库覆盖原有值。
正确操作流程:先通过id从数据库查询出完整的持久化对象,仅修改需要更新的字段后再调用save方法,此时查询得到的对象本身带有原有createdDate值,更新时不会被覆盖。 - 你当前实体类使用了
@SuperBuilder注解,如果更新时通过builder构造带id的实体,必须显式传入数据库中已有的createdDate值,否则builder生成的对象该字段默认是null,存入后会覆盖原值。 - 如果使用
MongoTemplate的updateFirst/updateMulti等方法做部分更新,构造Update对象时不要加入createdDate字段,仅设置需要更新的字段即可,不会修改原有createdDate的值。
内容的提问来源于stack exchange,提问作者yali
相关产品推荐
相关产品推荐

