Spring Data MongoDB自定义ID替代ObjectId失效问题求助
问题分析与解决方案
问题原因
- 字段访问权限限制:你定义的
productCode字段是包私有(默认访问修饰符),Spring Data MongoDB在映射实体时无法正常读写该字段,导致自定义ID未被识别。 - 缺少无参构造函数:Spring Data实例化实体类时依赖无参构造函数完成对象创建与属性注入,你的实体类仅提供带参构造函数,会干扰映射逻辑。
- 未确认ID值有效性:若保存时传入的
Product对象中productCode为null,MongoDB会自动生成ObjectId作为默认ID。
解决方案
1. 调整实体类结构
修改字段访问权限并添加无参构造函数、getter/setter方法,确保Spring Data能正常处理实体属性:
@Document(collection="products") public class Product { @Id @Indexed(unique = true, direction = IndexDirection.ASCENDING) private String productCode; private String descr; private Integer quantity; // 必须添加无参构造函数 public Product() {} public Product(String productCode, String descr, Integer quantity) { this.productCode = productCode; this.descr = descr; this.quantity = quantity; } // 添加所有字段的getter和setter public String getProductCode() { return productCode; } public void setProductCode(String productCode) { this.productCode = productCode; } public String getDescr() { return descr; } public void setDescr(String descr) { this.descr = descr; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } }
2. 确保保存时传入有效ID
调用保存方法时,确认productCode不为空值:
// 示例保存代码 Product product = new Product("PROD001", "Best in breed watches", 122222); productRepository.save(product).block();
3. 可选:显式指定ID映射字段
如果上述调整后仍未生效,可添加@Field("_id")注解强制映射到MongoDB的_id字段:
@Id @Field("_id") @Indexed(unique = true, direction = IndexDirection.ASCENDING) private String productCode;
验证效果
调整后保存的数据将使用自定义的productCode作为_id:
{ "_id" : "PROD001", "descr" : "Best in breed watches", "quantity" : 122222 }
内容的提问来源于stack exchange,提问作者BreenDeen
相关产品推荐
相关产品推荐

