You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data Elasticsearch乐观锁与自动日期字段配置问题

Spring Boot 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:10:07