使用Spring MongoTemplate新建对象时如何将Mongo ID设为null
Spring Data MongoDB 保存新建对象时将ID置空的实现方案
Spring Data MongoDB 原生支持ID为null时自动生成MongoDB ObjectId的逻辑,只要保证保存操作触发的是插入而非更新逻辑即可,具体实现分以下几种情况:
普通新建对象场景
实例化实体对象后,显式调用ID字段的set方法将其赋值为null,再调用保存方法即可,MongoDB会自动生成唯一的_id值,保存完成后该值会自动回填到实体对象的ID字段中。
示例代码:// 实体类定义 import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "biz_doc") public class BizDocument { @Id private String id; private String content; // 省略getter、setter } // 业务保存逻辑 BizDocument newDoc = new BizDocument(); newDoc.setId(null); // 显式置空ID newDoc.setContent("测试文档内容"); // 不管是用MongoTemplate还是MongoRepository的save方法都生效 mongoTemplate.save(newDoc); // 执行完上面的方法后,newDoc.getId()就能拿到Mongo自动生成的ID值拷贝已有对象生成新对象的场景
如果新对象是从数据库查出的已有对象复制而来,除了置空@Id标注的字段外,还要把实体类中@Version标注的乐观锁字段一并置空,否则框架会误将该对象识别为待更新的旧数据,触发更新逻辑甚至抛出乐观锁冲突异常。常见注意事项
- 不要给ID字段配置自动赋值的自定义转换器,如果之前写过保存前自动生成ID的
Converter逻辑,需要针对新建场景关闭该逻辑 - 如果ID字段声明为原始类型(比如
long/int),由于原始类型无法赋值为null,会默认取0值触发更新逻辑,需要将ID字段类型改为对应包装类(Long/Integer),推荐直接使用String类型接收MongoDB自动生成的ObjectId - 如果需要强制走插入逻辑,也可以调用
insert()方法代替save(),但要保证库中没有对应ID的文档,提前置空ID是兼容性最高的方案
- 不要给ID字段配置自动赋值的自定义转换器,如果之前写过保存前自动生成ID的
内容的提问来源于stack exchange,提问作者debiddo
相关产品推荐
相关产品推荐

