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

