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

为什么Spring Data MongoDB的insert/save操作不返回ObjectId?

问题原因

这不是配置错误,是Spring Data MongoDB 3.x版本的_id字段映射规则不匹配导致的:
你当前实体类的id字段为String类型,仅标注了@Id注解,框架默认会认为该字段对应MongoDB中字符串类型的_id。而MongoDB默认自动生成的主键是ObjectId类型,类型不匹配导致插入后生成的主键没有被回写到返回的实体对象中。
查询操作时框架会自动将MongoDB中存储的ObjectId转为字符串映射到id字段,所以查询返回的对象携带id。

解决方案

方案1(推荐):添加@MongoId注解明确映射规则

修改实体类的id字段注解,明确指定映射的目标类型为OBJECT_ID:

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

@Document(collection = "address")
class Address {
    @MongoId(targetType = FieldType.OBJECT_ID)
    var id: String? = null
    var label: String? = null
    var number: String? = null
    var street: String? = null
    ...
}

修改后insert/save方法都会自动将生成的ObjectId转为字符串回写到实体的id字段中。

方案2:修改id字段类型为ObjectId

如果可以接受主键类型为ObjectId,直接调整字段类型即可:

import org.bson.types.ObjectId

@Document(collection = "address")
class Address {
    @Id
    var id: ObjectId? = null
    ...
}

需要使用字符串形式的id时,调用id?.toHexString()方法转换即可。

方案3:手动生成主键

如果不想调整实体定义,也可以在插入前手动生成主键赋值,完全不依赖框架的自动回写逻辑:

val address = Address().apply {
    id = ObjectId().toHexString()
    // 其他字段赋值
}
val savedAddress = addressRepository.insert(address)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:09:05