对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

创建实体来表示集合

在本指南中,您可以学习如何创建表示 MongoDB 集合的 Hibernate ORM 实体。实体是定义数据结构的Java类。使用 Hibernate ORM 扩展时,您可以将每个实体映射到MongoDB集合,并使用这些实体与集合的文档进行交互。

提示

实体教程

要查看演示如何使用实体和 Hibernate ORM 扩展对一对多关系进行建模的教程,请参阅使用 Hibernate ORM 和MongoDB 进行建模关系 Foojay 博客文章。

MongoDB以称为BSON的二进制表示形式组织和存储文档,从而支持灵活数据处理。本节介绍 Hibernate ORM 扩展对BSON字段的支持,您可以将其包含在实体中。

提示

要学习;了解有关MongoDB如何存储BSON数据的更多信息,请参阅MongoDB Server手册中的BSON 类型。

下表描述了支持的BSON字段类型以及可在 Hibernate ORM 实体中使用的 Hibernate ORM 扩展等效项:

BSON字段类型
扩展字段类型
BSON描述

null

null

表示空值或数据缺失。

Binary

byte[]

存储子类型为 0 的二进制数据。

String

char、java.lang.Character、java.lang.String 或 char[]

存储 UTF-8 编码的字符串值。

Int32

int or java.lang.Integer

存储 32 位有符号整数。

Int64

long or java.lang.Long

存储 64 位有符号整数。

Double

double or java.lang.Double

存储浮点值。

Boolean

boolean or java.lang.Boolean

存储 true 或 false 值。

Decimal128

java.math.BigDecimal

存储 28 位十进制值。

ObjectId

org.bson.types.ObjectId

存储MongoDB用主节点 (primary node in the replica set)键的唯一 12 字节标识符。

Date

java.time.Instant

将日期和时间存储为自 Unix 纪元以来的毫秒数。

Object

@org.hibernate.annotations.Struct aggregate embeddable

存储嵌入式文档,并根据各自的类型映射字段值。 @Struct 聚合嵌入式对象还可能包含大量或 Collection 属性。

Array

Array、java.util.Collection(或子类型)支持的类型

存储大量值,其中的元素根据各自的类型进行映射。字符数组需要设置 hibernate.type.wrapper_array_handling 配置属性。

要创建表示MongoDB集合的实体,请在项目的基础包目录中创建一个新的Java文件,并将实体类添加到新文件中。在实体类中,指定要存储的字段和集合名称。@jakarta.persistence.Table 注释的 name 元素表示您的MongoDB集合名称。使用以下语法定义实体:

@Entity
@Table(name = "<collection name>")
public class <EntityName> {
@Id
// Specify your primary key field here
private <field type> <field name>;
// Include additional fields here
private <field type> <field name>;
// Parameterized constructor
public <EntityName>(<parameters>) {
// Initialize fields here
}
// Default constructor
public <EntityName>() {
}
// Getter and setter methods
public <field type> get<FieldName>() {
return <field name>;
}
public void set<FieldName>(<field type> <field name>) {
this.<field name> = <field name>;
}
}

要使用实体,您可以在应用程序文件中查询实体。要学习有关 Hibernate ORM 扩展中的 CRUD 操作的更多信息,请参阅 执行 CRUD 操作 指南。

此示例Movie.java 实体类定义了一个 Movie 实体,其中包含以下信息:

  • @Entity 将该类标记为 Hibernate ORM 实体的注解

  • @Table 注释,用于将实体映射到Atlas示例数据集中的 movies集合

  • @Id 和 @ObjectIdGenerator 注解,用于将 id字段指定为主主键并配置自动 ObjectId 生成

    提示

    主键值

    此示例将 ObjectId字段指定主键,但您也可以使用 @Id 注解将 String、Int 或 UUID 字段设立主键。

  • 表示电影数据的私有字段

  • 用于实体实例化的默认构造函数和参数化构造函数

  • 提供对实体字段访问权限权限的 Getter 和 setter 方法

package org.example;
import com.mongodb.hibernate.annotations.ObjectIdGenerator;
import org.bson.types.ObjectId;
import java.util.List;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "movies")
public class Movie {
@Id
@ObjectIdGenerator
private ObjectId id;
private String title;
private String plot;
private int year;
private List<String> cast;
public Movie(String title, String plot, int year, List<String> cast) {
this.title = title;
this.plot = plot;
this.year = year;
this.cast = cast;
}
public Movie() {
}
public ObjectId getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPlot() {
return plot;
}
public void setPlot(String plot) {
this.plot = plot;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public List<String> getCast() {
return cast;
}
public void setCast(List<String> cast) {
this.cast = cast;
}
}

提示

要了解有关实体类定义中使用的字段的更多信息,请参阅本指南中MongoDB BSON字段部分。

Hibernate ORM 扩展通过 Hibernate ORM @Embeddable 注释支持嵌入式文档。使用嵌入式文档,您可以在MongoDB文档中创建一对多、多对一和一对一关系。这种格式非常适合表示经常一起访问的数据。

要表示嵌入式文档,请在类上使用 @Struct 和 @Embeddable 注解来创建 @Struct 聚合嵌入式文档。然后,将可嵌入类型作为字段包含在父实体中。Hibernate ORM 扩展支持嵌入单个对象、数组和可嵌入对象的集合。

提示

要了解有关 @Struct 聚合可嵌入项的更多信息,请参阅 Hibernate ORM 文档中的 @Struct 聚合可嵌入项映射。

A One-to-One relationship is when a record in one database is associated with exactly one record in another database. In MongoDB, you can create a collection with an embedded document field to model a One-to-One relationship. The Hibernate ORM extension allows you to create embedded document fields by using @Struct aggregate embeddables.

该示例在实体中定义了一个具有@Struct 聚合嵌入式类型的字段,类似于本指南中的定义实体示例。示例Movie.java 实体类包含以下信息:

  • @Entity 和 @Table 注解,用于定义实体并将其映射到 movies集合

  • @Id 以及将 id字段指定为主键的 @ObjectIdGenerator 注解

  • 表示电影标题的字符串字段

  • @Struct 聚合表示电影奖项和工作室信息的可嵌入式字段

The following example represents a One-to-One relationship because each Movie entity is associated with one Awards embeddable and one Studio embeddable:

@Entity
@Table(name = "movies")
public class Movie {
@Id
@ObjectIdGenerator
private ObjectId id;
private String title;
private Awards awards;
private Studio studio;
public Movie(String title, Awards awards, Studio studio) {
this.title = title;
this.awards = awards;
this.studio = studio;
}
public Movie() {
}
// Getter and setter methods
}

以下示例代码创建一个 Awards @Struct 聚合可嵌入对象:

@Embeddable
@Struct(name = "Awards")
public class Awards {
private int wins;
private int nominations;
private String text;
public Awards(int wins, int nominations, String text) {
this.wins = wins;
this.nominations = nominations;
this.text = text;
}
public Awards() {
}
// Getter and setter methods
}

以下示例代码创建一个 Studio @Struct 聚合可嵌入对象:

@Embeddable
@Struct(name = "Studio")
public class Studio {
private String name;
private String location;
private int foundedYear;
public Studio(String name, String location, int foundedYear) {
this.name = name;
this.location = location;
this.foundedYear = foundedYear;
}
public Studio() {
}
// Getter and setter methods
}

一对多关系是指一个数据库中的一条记录与另一个数据库中的多条记录相关联。在MongoDB中,您可以定义一个集合字段来存储嵌入式文档列表,以对一对多关系进行建模。Hibernate ORM 扩展允许您使用 @Struct 聚合可嵌入对象的列表来创建嵌入式文档字段。

该示例定义了一个字段,用于在实体中存储@Struct 聚合可嵌入式对象的列表,类似于本指南中的定义实体示例。示例Movie.java 实体类包含以下信息:

  • @Entity 和 @Table 注解,用于定义实体并将其映射到 movies集合

  • @Id 以及将 id字段指定为主键的 @ObjectIdGenerator 注解

  • 表示电影标题的字符串字段

  • 存储多个 Writer @Struct 聚合可嵌入对象的列表字段,表示作者信息

The following example represents a One-to-Many relationship because each Movie entity is associated with multiple Writer embeddables:

@Entity
@Table(name = "movies")
public class Movie {
@Id
@ObjectIdGenerator
@Column(name = "_id")
private ObjectId id;
private String title;
private List<Writer> writers;
public Movie(String title, List<Writer> writers) {
this.title = title;
this.writers = writers;
}
public Movie() {
}
// Getter and setter methods
}

以下示例代码创建一个 Writer @Struct 聚合可嵌入对象:

@Embeddable
@Struct(name = "Writer")
public class Writer {
private String name;
public Writer() {
}
public Writer(String name) {
this.name = name;
}
// Getter and setter methods
}

要学习;了解如何使用实体运行数据库操作,请参阅“与数据交互”部分中的以下指南:

要学习;了解有关 Hibernate ORM 字段的更多信息,请参阅 Hibernate ORM 文档中的映射类型部分。

要学习;了解有关 Hibernate ORM 实体的更多信息,请参阅 Hibernate ORM 文档中的POJO 模型。