使用spring-data-elasticsearch更新实体时LastModifiedDate未更新问题
问题原因
- Spring Data Elasticsearch的审计注解
@LastModifiedDate、@CreatedDate等,仅在调用框架提供的save()/saveAll()类方法(包括Repository的save方法、ElasticsearchOperations的save方法)操作完整实体对象时才会触发,审计切面会在这类方法执行时自动填充/更新审计字段。 - 你当前使用的是
ElasticsearchOperations.update()方法,直接传入自定义的Document对象执行部分字段更新,该流程不会触发审计切面逻辑,框架不会自动处理@LastModifiedDate标注的字段,因此修改时间不会自动更新。 - 额外前置检查:若你在使用save方法时审计也不生效,需确认配置类上已添加
@EnableElasticsearchAuditing注解开启审计功能,同时实体类上已标注@Auditable注解。
解决方案
- 方案一:走完整实体更新流程,自动触发审计
先根据id查询出完整的实体对象,修改需要更新的属性后,调用repository.save(实体)或者operations.save(实体)方法执行更新,此时框架会自动更新modifiedDate字段。适合更新字段较少、不需要极致性能的场景。 - 方案二:部分更新时手动填充修改时间
如果你需要保留当前的部分更新逻辑来避免查询全量实体的开销,直接在构建Document对象时手动添加修改时间字段即可:
无需修改其他更新逻辑,即可实现修改时间同步更新。document.put("modified_dt", Instant.now()); - 方案三:使用更新脚本赋值
构建UpdateQuery时指定更新脚本,在脚本中给modified_dt字段赋值当前时间,适合批量更新等特殊场景。
内容的提问来源于stack exchange,提问作者Rpj
相关产品推荐
相关产品推荐

