Spring MongoDB更新对象列表时嵌套Address的addrId未自动生成且不显示问题
问题根因
Spring Data MongoDB 中 @Id 注解的自动ID生成逻辑仅对添加了@Document注解的顶级文档实体生效,你代码中的Address是内嵌在Person中的普通POJO类,不会被MongoTemplate识别为需要自动生成ID的实体,所以addrId字段不会被自动赋值,保存到数据库时自然没有这个字段。
解决方法
方法1:手动填充addrId(最简便)
在将Address对象加入列表前,手动生成ObjectId赋值即可:
import org.bson.types.ObjectId; // 你的原有逻辑 addr.setAddrId(ObjectId.get().toString()); Set<Address> addresses = new HashSet<>(); addresses.add(addr);
方法2:配置全局监听器自动填充嵌套ID
如果需要对所有Person的内嵌Address统一自动生成ID,可以注册一个前置转换回调,不用每次手动赋值:
import org.bson.types.ObjectId; import org.springframework.data.mongodb.core.mapping.event.BeforeConvertCallback; import org.springframework.stereotype.Component; @Component public class AddressIdFillCallback implements BeforeConvertCallback<Person> { @Override public Person onBeforeConvert(Person person, String collection) { if (person.getAddresses() != null) { person.getAddresses().forEach(addr -> { if (addr.getAddrId() == null) { addr.setAddrId(ObjectId.get().toString()); } }); } return person; } }
原有代码可优化点
你提供的示例代码存在两处明显问题:
- 方法参数已经定义了
Person person变量,后续查询时又重复定义了同名的Person person,会编译报错 - 方法中创建的是
HashSet<Address>类型的地址集合,但Person类中定义的addresses是List<Address>类型,直接赋值会出现类型不匹配错误
内容的提问来源于stack exchange,提问作者Coder17
相关产品推荐
相关产品推荐

