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

寻找适用于MongoDB的Jakarta @Embeddable替代方案

MongoDB 替代 Jakarta @Embeddable 的方案

在MongoDB这类非关系型数据库中,想要实现类似Jakarta Persistence里@Embeddable/@Embedded的组合复用、字段平级存储效果,可通过Spring Data MongoDB提供的@Embedded注解实现,具体示例如下:

传统写法(所有字段集中在同一类)

public class Company {
    private Integer id;
    private String name;
    private String address;
    private String phone;
    private String contactFirstName;
    private String contactLastName;
    private String contactPhone;
}

提取可复用的嵌入类

创建包含通用字段的类,无需额外注解(按需也可在类上添加@Embedded,但通常非必需):

public class ContactPerson {
    private String firstName;
    private String lastName;
    private String phone;
}

通过组合构建目标类

在主实体类中用@Embedded标记嵌入对象,MongoDB会将嵌入类的字段平级存储到主文档中,而非嵌套子文档:

import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.Embedded;

@Document(collection = "companies")
public class Company {
    @Field("_id")
    private Integer id;
    private String name;
    private String address;
    private String phone;
    
    @Embedded
    private ContactPerson contactPerson;
}

最终MongoDB中存储的文档结构示例:

{
  "_id": 1,
  "name": "示例公司",
  "address": "某街道123号",
  "phone": "010-12345678",
  "firstName": "张三",
  "lastName": "李四",
  "phone": "13800138000"
}

额外说明

  • 若要避免字段名冲突,可自定义嵌入字段前缀:@Embedded(prefix = "contact_"),此时存储的字段会变为contact_firstName、contact_lastName形式。
  • 若不使用@Embedded,直接声明嵌入对象,MongoDB会将其作为嵌套子文档存储,无法实现平级字段效果。

内容的提问来源于stack exchange,提问作者Paul Marcelin Bejan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:52:08