Spring Data Elasticsearch乐观锁与自动日期字段配置问题
1. Spring Data Elasticsearch 是否支持配置乐观锁?
完全支持,它基于 Elasticsearch 原生版本控制机制实现乐观锁,你遇到的 version_conflict_engine_exception 通常是版本号不匹配导致的,具体配置和注意事项如下:
基础乐观锁配置:
在实体类的版本字段上添加@Version注解即可开启内置乐观锁,比如你的TestIndex类:@Document(indexName = "test_index") public class TestIndex { @Id private String id; @Version private Long indexVersion; // 创建时自动赋值为1,更新时自增 // 其他字段... }通过
TestRepository.save()更新文档时,Spring Data Elasticsearch 会自动携带当前版本号,Elasticsearch 会对比版本号,仅匹配时执行更新,不匹配则抛出版本冲突异常。外部版本控制配置:
若需自定义版本号规则(比如使用业务侧版本值),可配置外部版本控制,只需在@Document注解中指定versionType:@Document(indexName = "test_index", versionType = VersionType.EXTERNAL) public class TestIndex { @Id private String id; @Version private Long indexVersion; // 手动传入自定义版本号,要求必须大于当前存储的版本号 // 其他字段... }注意:
VersionType.EXTERNAL要求传入的版本号大于当前存储值;若允许等于,可改用VersionType.EXTERNAL_GTE。
2. 如何配置自动填充创建日期/更新日期字段?
不需要手动处理,可通过 Spring Data Elasticsearch 的审计功能实现,逻辑和 JPA 类似:
步骤1:给实体类添加审计注解
在日期字段上添加 @CreatedDate 和 @LastModifiedDate 注解,同时指定字段类型:
@Document(indexName = "test_index") @EntityListeners(AuditingEntityListener.class) public class TestIndex { @Id private String id; @Version private Long indexVersion; @CreatedDate @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second_millis) private LocalDateTime createTime; @LastModifiedDate @Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second_millis) private LocalDateTime updateTime; // 其他字段... }
步骤2:开启 Elasticsearch 审计支持
在 Spring Boot 启动类上添加 @EnableElasticsearchAuditing 注解:
@SpringBootApplication @EnableElasticsearchAuditing public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
此后调用 save() 方法创建或更新文档时,createTime 会在首次创建时自动赋值,updateTime 会在每次更新时自动刷新,无需手动设置。
内容的提问来源于stack exchange,提问作者Yegor Saliev

