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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:57:03