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
相关产品推荐
相关产品推荐

