寻找适用于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
相关产品推荐
相关产品推荐

