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

MongoDB保存数据时已设置id仍自动生成新id该如何配置关闭

问题原因

这是Spring Data MongoDB的默认ID生成逻辑导致的:未显式标记主键注解时,框架会在数据插入前自动生成ObjectId作为_id存入MongoDB,覆盖你预先设置的id字段值。

解决方案

方案1:给ID字段加主键注解(推荐,单实体适配)

给实体类的id字段加上org.springframework.data.annotation.Id注解,框架识别到该字段被标记为主键且已手动赋值时,会直接使用你设置的值作为MongoDB的_id,不会自动生成覆盖:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "你的集合名")
public class SampleObject {
    @Id
    private String id;
    
    // 其余字段、getter、setter省略
}

原有保存逻辑不需要修改:

SampleObject sampleObject = new SampleObject();
sampleObject.setId("f9de2416-1d10-11ec-a8b5-00ff37757c54");
repository.save(sampleObject); // 此时返回的对象id就是你设置的值

方案2:使用@MongoId注解(适配Spring Data MongoDB 3.0+版本)

如果使用3.x以上版本的Spring Data MongoDB,也可以用@MongoId注解直接标记主键,效果和@Id一致:

import org.springframework.data.mongodb.core.mapping.MongoId;

public class SampleObject {
    @MongoId
    private String id;
}

方案3:全局关闭自动ID生成(特殊场景使用)

如果需要所有实体都优先使用手动设置的ID,可以自定义MongoDB配置类,重写ID生成逻辑:

@Configuration
public class MongoConfig extends AbstractMongoClientConfiguration {
    // 其余基础配置省略

    @Bean
    @Override
    public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory databaseFactory, MongoCustomConversions customConversions, MongoMappingContext mappingContext) {
        MappingMongoConverter converter = super.mappingMongoConverter(databaseFactory, customConversions, mappingContext);
        // ID为空时才自动生成,有值直接保留
        converter.setIdGenerator((id, entityType) -> id == null ? ObjectId.get().toString() : id);
        return converter;
    }
}

内容的提问来源于stack exchange,提问作者KrisKris1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:36:01