AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.

컬렉션을 나타내는 엔터티 만들기

이 가이드에서는 MongoDB 컬렉션을 나타내는 최대 절전 모드 ORM 엔터티 를 만드는 방법을 학습 수 있습니다. 엔터티는 데이터의 구조를 정의하는 Java 클래스입니다. 하이버네이트 ORM 확장을 사용할 때 각 엔터티를 MongoDB 컬렉션 에 매핑하고 이러한 엔터티를 사용하여 컬렉션의 문서와 상호 작용 수 있습니다.

팁

엔터티 튜토리얼

엔터티와 하이버네이트 ORM 확장을 사용하여 일대다 관계를 모델링하는 방법을 보여주는 튜토리얼을 보려면 하이버네이트 ORM 및 MongoDB hoojay를 사용한 관계 모델링 블로그 포스트 참조하세요.

MongoDB 유연한 데이터 처리 허용하는 BSON 이라는 바이너리 표현으로 문서를 구성하고 저장합니다. 이 섹션에서는 엔터티에 포함할 수 있는 BSON 필드에 대한 하이버네이트 ORM 확장 지원 대해 설명합니다.

팁

MongoDB BSON 데이터를 저장하는 방법에 대해 자세히 학습 MongoDB Server 매뉴얼에서 BSON 유형을 참조하세요.

다음 표에서는 지원되는 BSON 필드 유형과 하이버네이트 ORM 엔터티에서 사용할 수 있는 해당 하이버네이트 ORM 확장에 해당하는 내용을 설명합니다.

BSON 필드 유형
확장 필드 유형
BSON 설명

null

null

null 값 또는 데이터 부재를 나타냅니다.

Binary

byte[] or java.util.UUID

하위 유형 0의 이진 데이터 또는 하위 유형 4의 UUID 값을 저장합니다.

String

char, java.lang.Character, java.lang.String, char[], java.time.ZoneId, java.time.ZoneOffset 또는 java.util.TimeZone

유티에프-8 인코딩된 string 값을 저장합니다. ZoneId 및 TimeZone 유형은 자신의 ID를 저장합니다. 예를 들어 Europe/Paris 등. ZoneOffset 형식은 +02:00 등의 오프셋 ID를 저장합니다.

Int32

int, java.lang.Integer 또는 java.time.Year

부호 있는 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 or java.time.Duration

28비트 10진수 값을 저장합니다. java.time.Duration 값은 지속 시간을 나노초 단위로 저장합니다.

ObjectId

org.bson.types.ObjectId

MongoDB 프라이머리 키로 사용하는 고유한 12바이트 식별자를 저장합니다.

Date

java.time.Instant

유닉스 시간 이후의 밀리초 단위로 날짜와 시간을 저장합니다.

Object

@org.hibernate.annotations.Struct 애그리게이션 임베딩 가능

내장된 문서를 각각의 유형에 따라 필드 값을 매핑하여 저장합니다. @Struct 집계 개체는 또한 배열 또는 Collection 속성을 포함할 수 있습니다.

Array

Array, 지원되는 유형의 java.util.Collection (또는 하위 유형)

요소가 각각의 유형에 따라 매핑된 배열 값을 저장합니다. 문자 배열은 hibernate.type.wrapper_array_handling 구성 속성을 설정해야 합니다.

참고

@JdbcTypeCode 주석은 지원되지 않습니다

Hibernate ORM 확장은 @org.hibernate.annotations.JdbcTypeCode 어노테이션을 지원하지 않으며, 이 어노테이션을 사용하여 필드의 유형 매핑을 재정의하면 예외가 발생합니다.

Hibernate ORM은 해당 유형에 대한 다른 매핑이 없는 경우 java.io.Serializable을(를) 구현하는 모든 Java 유형을 이진 데이터로 직렬화합니다. 데이터가 이 형식으로 저장되지 않도록 Hibernate ORM 확장은 다음 유형을 거부하고 애플리케이션이 시작될 때 예외를 발생시킵니다. 이 검사는 기본 키, 일반 필드, 포함 가능한 속성 및 컬렉션 요소에 적용됩니다.

다음 표는 지원되지 않는 필드 유형과 지원되는 대안을 설명합니다.

카테고리
지원되지 않는 유형
지원되는 대안

날짜 및 시간

java.util.Calendar, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.time.LocalTime, java.time.LocalDateTime, java.time.ZonedDateTime, java.time.OffsetTime, java.time.OffsetDateTime

java.time.Instant을(를) 사용하세요.

BSON Values

org.bson.types.BSONTimestamp, org.bson.types.Binary, org.bson.types.Code, org.bson.types.CodeWithScope, org.bson.types.CodeWScope, org.bson.types.MinKey, org.bson.types.MaxKey, org.bson.types.Symbol, org.bson.types.Decimal128

이진 데이터에는 byte[]을(를) 사용하고 십진수 값에는 java.math.BigDecimal을(를) 사용하세요. 다른 유형에는 해당하는 항목이 없습니다.

BSON 문서

org.bson.Document, org.bson.BsonDocument, org.bson.RawBsonDocument, org.bson.BsonDocumentWrapper

@org.hibernate.annotations.Struct 애그리게이션 임베딩 가능을 사용합니다.

MongoDB 컬렉션을 나타내는 엔티티를 생성하려면 프로젝트의 기본 패키지 디렉토리에 새 Java 파일을 만들고 새 파일에 엔티티 클래스를 추가하세요. 엔티티 클래스에서 저장할 필드와 컬렉션 이름을 지정하세요.

@jakarta.persistence.Table 주석의 name 요소는 MongoDB 컬렉션 이름을 나타냅니다. 이 가이드의 스키마 한정자 섹션에 설명된 대로 선택 사항인 schema 요소를 설정하여 컬렉션 이름 앞에 접두사를 붙일 수도 있습니다. 다음 구문을 사용하여 엔터티를 정의합니다.

@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>; }}

엔터티를 사용하려면 애플리케이션 파일에서 엔터티를 쿼리 하면 됩니다. 최대 절전 모드 ORM 확장의 CRUD 작업에 대해 자세히 학습하려면 CRUD 작업 수행 가이드를 참조하세요.

중요

기본 키 필드 이름은 _id여야 합니다.

MongoDB는 기본 키 필드가 _id 필드에 매핑되도록 요구합니다. @Column 주석 또는 orm.xml 재정의를 사용하여 @Id 필드의 열 이름을 명시적으로 설정할 수 있습니다. 이 이름을 _id 이외의 값으로 설정하면 Hibernate ORM 확장이 부트스트랩 시 FeatureNotSupportedException를 발생시킵니다. 이 오류를 해결하려면 @Column 주석을 제거하거나 이름을 _id로 설정하세요.

이 유효성 검사는 레거시 Hibernate Mapping(HBM) XML 매핑에는 적용되지 않습니다. HBM XML을 사용하여 엔티티를 매핑하는 경우, Hibernate ORM 확장은 예외를 발생시키는 대신 식별자 열의 이름을 _id (으)로 자동으로 변경합니다.

@Table 어노테이션은 컬렉션 이름 앞에 접두사를 붙이는 선택 사항인 schema 요소를 허용합니다. 두 요소를 모두 설정하면 Hibernate ORM 확장이 엔티티를 <schema name>.<collection name>라는 이름의 컬렉션에 매핑합니다.

스키마 한정자는 컬렉션의 이름만 변경합니다. 스키마는 별도의 MongoDB 데이터베이스가 아닙니다. 모든 스키마 한정 컬렉션은 SessionFactory 인스턴스가 연결되는 데이터베이스에 상주합니다. 이러한 컬렉션은 하나의 데이터베이스를 공유하므로 트랜잭션이 여러 스키마에 걸쳐 있을 수 있습니다.

스키마 한정자를 적용하려면 다음 구문을 사용하세요.

@Entity@Table(schema = "<schema name>", name = "<collection name>")public class <EntityName> { // Define your fields, constructors, and methods here }

참고

스키마 한정자 제한 사항

Hibernate ORM 확장은 부트스트랩 시 @Table 어노테이션의 catalog 요소와 hibernate.default_catalog 구성 속성을 거부합니다. 애플리케이션이 여러 MongoDB 데이터베이스에 액세스해야 하는 경우 각 데이터베이스에 대해 별도의 SessionFactory 인스턴스를 만듭니다.

Hibernate ORM 확장은 부트스트랩 시 테이블 이름이나 스키마 이름에 점(.)이 있는 경우 이를 거부합니다. 이 제한은 프라이머리, 세컨더리, 조인 및 컬렉션 테이블 이름과 schema 속성 또는 hibernate.default_schema 구성 속성으로 설정된 스키마 이름에 적용됩니다.

이 샘플 Movie.java 클래스는 다음 정보를 포함하는 Movie 엔티티를 정의합니다.

  • @Entity 클래스를 최대 절전 모드 ORM 엔터티로 표시하는 주석

  • @Table Atlas 샘플 데이터 세트의 컬렉션 에 엔터티를매핑하는 주석 movies

  • @Id 및 id 필드 기본 키 지정하고 자동 ObjectId 생성을 구성하는 @ObjectIdGenerator 주석

    팁

    기본 키 값

    이 예시에서는 ObjectId 필드를 엔터티의 기본 키로 지정하지만, @Id 주석을 사용하여 String 또는 int 필드를 기본 키로 설정할 수도 있습니다. 자세한 내용은 지원되지 않는 필드 유형을 참조하세요.

  • 영화 데이터를 나타내는 비공개 필드

  • 엔터티 인스턴스화를 위한 기본 생성자 및 매개변수화된 생성자

  • 엔터티의 필드에 대한 액세스 제공하는 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; private List<String> directors; public Movie(String title, String plot, int year, List<String> cast, List<String> directors) { this.title = title; this.plot = plot; this.year = year; this.cast = cast; this.directors = directors; } 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; } public List<String> getDirectors() { return directors; } public void setDirectors(List<String> directors) { this.directors = directors; }}

팁

엔터티 클래스 정의에 사용되는 필드에 대해 자세히 학습 보려면 이 가이드의 MongoDB BSON 필드 섹션을 참조하세요.

Hibernate ORM 확장은 엔티티에 증가하는 숫자 ID를 자동으로 할당할 수 있습니다. 트랜잭션이 롤백되거나 애플리케이션이 예약된 모든 ID를 사용하지 않는 경우 일부 번호가 누락될 수 있습니다.

Hibernate ORM 확장은 short, int, long 유형과 박싱된 Short, Integer, Long 유형에 대해 시퀀스로 생성된 ID를 지원합니다.

@GeneratedValue 및 @SequenceGenerator 주석을 사용하여 시퀀스로 생성된 ID를 엔터티에 추가할 수 있습니다. 다음 예시는 movies_SEQ 카운터에서 50 블록 단위로 ID를 예약합니다.

@Id@GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "movies_SEQ")@SequenceGenerator( name = "movies_SEQ", sequenceName = "movies_SEQ", allocationSize = 50)private Long id;

주석은 Hibernate ORM 확장이 ID를 어떻게 생성하는지를 제어합니다:

  • @GeneratedValue Hibernate ORM 확장에게 id 필드의 값을 생성하도록 지시합니다. 그 strategy 및 generator 속성은 확장기능이 ID를 만들는 방식을 정의합니다.

    • strategy: AUTO 또는 SEQUENCE. AUTO을 사용하면 Hibernate ORM 확장은 시퀀스를 사용하고, @SequenceGenerator을 선언할 필요가 없습니다. SEQUENCE을 사용하면, Hibernate ORM 확장은 generator 속성으로 이름이 지정된 시퀀스 생성기를 사용합니다.

    • generator: 사용할 @SequenceGenerator의 이름입니다. 이 속성을 생략하면 Hibernate ORM 확장은 movies 테이블의 경우 movies_SEQ와 같이 엔티티의 테이블 이름을 따서 시퀀스 이름을 지정합니다.

  • @SequenceGenerator 시퀀스 생성기를 접의합니다:

    • name: @GeneratedValue generator 속성이 참조하는 이름입니다.

    • sequenceName: 카운터 문서의 이름입니다. 생략하면 Hibernate ORM 확장이 생성자의 name을(를) 사용합니다.

    • initialValue: 첫 번째 생성된 ID가 시작되는 값. 기본값은 1입니다.

    • allocationSize: 각 블록에 예약된 ID의 수입니다.

Hibernate ORM 확장은 hibernate_sequences이라는 고정 컬렉션에 카운터 문서를 저장합니다. 각 시퀀스는 다음 필드가 있는 하나의 카운터 문서를 사용합니다.

  • _id 은 시퀀스 이름입니다.

  • next_value Hibernate ORM 확장이 다음 ID를 생성하기 위해 증가시키는 카운터 값입니다. 이는 시퀀스 생성기의 initialValue과 일치해야 하며, 기본값은 1입니다.

  • increment 한 번에 예약되는 ID의 수입니다. 시퀀스 생성기의 allocationSize 값과 일치해야 합니다. 일치하지 않으면 SessionFactory이(가) 시작되지 않습니다.

Hibernate ORM 확장은 블록 단위로 ID를 가져옵니다. 이렇게 하면 데이터베이스에 문의해야 하는 횟수가 줄어듭니다. 동시에 이루어진 요청은 각각 다른 ID를 받습니다.

중요

카운터 문서 요구 사항

next_value 및 increment은 모두 64비트 정수(BSON Int64)여야 합니다. 두 필드 중 하나가 누락되었거나 값을 32비트 정수로 저장하는 카운터 문서는 ID를 할당할 수 없습니다. 스키마 관리가 비활성화된 경우, 애플리케이션이 ID를 할당하기 전에 각 시퀀스에 대한 카운터 문서를 생성해야 합니다.

스키마 관리는 엔터티에 필요한 데이터베이스 객체를 생성하는 Hibernate ORM의 방식입니다. Hibernate ORM 확장은 이를 사용하여 시퀀스로 생성된 ID에 대한 카운터 문서를 생성합니다.

스키마 관리를 활성화하려면 hibernate.properties 또는 persistence.xml 파일에서 jakarta.persistence.schema-generation.database.action 속성을 설정하세요. 다음 값 중 하나를 사용합니다.

  • create: 카운터 문서를 생성하고 SessionFactory이(가) 닫힐 때 해당 문서를 유지합니다.

  • create-drop: SessionFactory이 열릴 때 카운터 문서를 생성하고 닫힐 때 제거합니다.

다음 예시에서는 create을(를) 사용합니다.

jakarta.persistence.schema-generation.database.action=create

스키마 관리를 해제하려면 시퀀스 생성 ID에 대한 카운터 문서를 수동으로 만들 수 있습니다. 다음 속성을 설정합니다.

jakarta.persistence.schema-generation.database.action=none

그리고 나서 각 시큰스에 대해 hibernate_sequences 컬렉션에서 카운터 문서 하나를 만듭니다. 카운터 문서의 _id은 시퀀스 생성기의 sequenceName와 일치해야 합니다.

다음 예제에서는 MongoDB Java 드라이버를 사용하여 movies_SEQ 카운터 문서를 지정한 데이터베이스의 hibernate_sequences 컬렉션에 삽입합니다.

// Replace the placeholders with your connection string and database name.MongoClient client = MongoClients.create("<connection string>");MongoDatabase database = client.getDatabase("<database name>"); database.getCollection("hibernate_sequences").insertOne( new Document("_id", "movies_SEQ") .append("next_value", new BsonInt64(1)) .append("increment", new BsonInt64(50)));

삽입을 통해 표시된 카운터 문서를 생성합니다. next_value을(를) 생성기의 initialValue (으)로 설정하고 increment을(를) 해당 allocationSize(으)로 설정합니다.

다음 예시는 새로운 Movie 엔티티를 저장하고 생성된 ID를 출력합니다. ID는 시퀀스의 시작점에 따라 다릅니다. 1에서 시작하는 새 카운터의 출력은 다음과 같습니다.

var movie = new Movie();movie.setTitle("The Matrix");session.persist(movie);System.out.println("Movie created with ID: " + movie.getId());

Hibernate ORM 확장은 다음의 시퀀스 관련 전략, 형식 및 구성을 지원하지 않습니다.

  • IDENTITY 그리고 TABLE 생성 전략

  • BigInteger 및 BigDecimal 생성된 식별자 유형

  • . 문자를 포함하는 시퀀스 이름 또는 스키마

  • 3부 이름 또는 catalog 속성과 같이 카탈로그로 한정된 시퀀스 이름

  • 시퀀스 options

  • @GenericGenerator 및 @TableGenerator 생성기, @IdGeneratorType 주석을 사용하는 사용자 지정 생성기, identity, table 또는 increment와 같은 명명된 레거시 생성기

  • 엔티티를 hibernate_sequences 컬렉션에 매핑

  • insert ... select 생성된 ID의 내장 할당이 필요한 성명서

UUID는 Hibernate ORM 확장이 엔티티에 대해 생성할 수 있는 표준화된 16바이트 고유 ObjectId입니다. UUID 식별자를 생성하려면 엔티티의 @Id 필드에 @UuidGenerator 주석을 달거나 @GeneratedValue 주석의 strategy 요소를 UUID(으)로 설정합니다. 다음 예시는 UUID로 생성된 ID가 있는 엔티티를 정의합니다.

package org.example; import jakarta.persistence.Entity;import jakarta.persistence.Id;import jakarta.persistence.Table;import java.util.UUID;import org.hibernate.annotations.UuidGenerator; @Entity@Table(name = "items")public class UuidItem { @Id @UuidGenerator // or: @GeneratedValue(strategy = GenerationType.UUID) private UUID id; private String title; public UuidItem(String title) { this.title = title; } public UuidItem() { } // Getter and setter methods}

Hibernate ORM 확장은 java.util.UUID 값을 하위 유형 4의 BSON Binary 값으로 저장합니다. 다음 예시 문서는 생성된 UUID가 있는 _id 필드를 포함합니다.

{ "_id": { "$binary": { "base64": "FXvL4sBrQoueEByraiJUmA==", "subType": "04" } }, "title": "The Matrix"}

@Id 필드가 String인 경우, Hibernate ORM 확장은 생성된 UUID를 BSON Binary 값이 아닌 BSON String로 저장합니다.

BSON 필드 유형 매핑에 대해 자세히 학습 보려면 이 가이드의 MongoDB BSON 필드 섹션을 참조하세요.

다음 예시는 새로운 UuidItem 엔티티를 저장하고 생성된 ID를 출력합니다.

var item = new UuidItem();item.setTitle("The Matrix");session.persist(item);System.out.println("UuidItem created with ID: " + item.getId());

UUID로 생성된 ID를 사용할 때 Hibernate ORM 확장에는 다음과 같은 제한 사항이 있습니다.

  • Hibernate ORM 확장은 레거시 식별자 생성기 이름 uuid, uuid.hex, uuid2, guid을 지원하지 않습니다. 이러한 이름 중 하나를 지정하면 애플리케이션이 시작될 때 Hibernate ORM 확장이 FeatureNotSupportedException를 throw합니다. 대신 @UuidGenerator 또는 @GeneratedValue(strategy = GenerationType.UUID)을 사용하세요.

  • 엔티티를 지속하기 전에 @UuidGenerator @Id 필드에 값을 할당하면 Hibernate ORM 확장에서 jakarta.persistence.EntityExistsException가 발생합니다. UUID 값을 직접 할당하려면 @Id 필드에서 생성기 주석을 제거하세요.

둘 이상의 필드에서 엔터티를 키로 지정하려면 복합 기본 키를 정의합니다. 키 구성 요소를 보유하는 일반 @Embeddable 클래스 또는 기록을 만듭니다. 그런 다음 엔터티의 식별자 필드에 @jakarta.persistence.EmbeddedId 주석을 달아줍니다.

다음 BookId 임베디드 항목은 publisherId 구성 요소와 bookNo 구성 요소로 구성된 키를 정의합니다.

@Embeddablepublic record BookId(long publisherId, long bookNo) {}

다음 Book 엔터티는 BookId을(를) 기본 키로 사용합니다.

@Entity(name = "Book")@Table(name = "books")public class Book { @EmbeddedId private BookId id; private String title; public Book() { } public Book(BookId id, String title) { this.id = id; this.title = title; } // Getter and setter methods }

엔티티를 영속화하기 전에 애플리케이션에서 복합 키 값을 할당해야 합니다. Hibernate ORM 확장은 복합 키 값을 생성하지 않습니다.

Hibernate ORM 확장은 복합 키를 _id 하위 문서로 저장합니다. 앞의 Book 엔티티는 다음 형식으로 문서를 생성합니다.

{ "_id": { "bookNo": 2, "publisherId": 10 }, "title": "My Book"}

Hibernate ORM 확장은 _id 하위 문서의 구성 요소를 선언한 순서가 아니라 구성 요소 이름순으로 정렬합니다. 이 순서는 임베디드 가능 항목을 클래스로 선언하든 기록으로 선언하든 동일합니다.

중요

구성 요소 순서가 문서 일치에 미치는 영향

MongoDB는 필드 순서대로 하위 문서를 비교하므로, 동일한 구성 요소를 포함하더라도 순서가 다른 두 _id 값은 일치하지 않습니다. Hibernate ORM 확장은 항상 동일한 순서로 구성 요소를 쓰기 (write) 때문에, 이 동작은 MongoDB Java 드라이버와 같이 Hibernate ORM 확장 외부에서 이러한 문서를 읽거나 쓰기 (write)하는 경우에만 영향을 미칩니다.

다음 방법 중 하나로 복합 키를 선언하면 애플리케이션이 시작될 때 Hibernate ORM 확장이 FeatureNotSupportedException을(를) throw합니다.

  • @jakarta.persistence.IdClass 어노테이션 또는 여러 @Id 속성으로 선언된 비집계 식별자입니다. 대신 @EmbeddedId로 키를 선언하세요.

  • 식별자로 임베딩할 수 있는 @Struct 애그리게이션입니다. 대신 일반 @Embeddable을(를) 사용하세요.

  • 중첩된 @Embeddable 또는 컬렉션과 같이 기본 값이 아닌 구성 요소입니다. 복합 키의 모든 구성 요소는 기본 값이어야 합니다.

  • @jakarta.persistence.MapsId 주석을 사용하는 파생 ID를 포함하여 식별자 내의 연결입니다.

또한 > 또는 <과 같은 순서 연산자를 사용하여 전체 복합 식별자를 비교할 수 없습니다. 대신 개별 구성 요소를 비교하세요.

하이버네이트 ORM 확장은 하이버네이트 ORM @Embeddable 어노테이션을 통해 내장된 문서를 지원합니다. 내장된 문서를 사용하면 MongoDB 문서 내에서 일대다, 다대일 및 일대일 관계를 만들 수 있습니다. 이 형식은 함께 자주 액세스하는 데이터를 나타내는 데 이상적입니다.

내장된 문서를 나타내려면 클래스에 @Struct 및 @Embeddable 주석을 사용하여 @Struct 애그리게이션 임베딩 가능 항목을 만듭니다. 그런 다음 상위 엔터티에 임베딩 가능한 유형을 필드 로 포함합니다. 하이버네이트 ORM 확장은 단일 객체, 배열 및 임베딩 가능한 컬렉션의 임베딩을 지원합니다.

팁

@Struct 애그리게이션 임베딩 가능에 대해 자세히 학습하려면 Hibernate ORM 문서에서 @Struct 애그리게이션 임베딩 가능 매핑 을 참조하세요.

일대일 관계 한 데이터베이스 의 기록 다른 데이터베이스 의 정확히 하나의 기록 와 연결되는 경우입니다. MongoDB 에서는 내장된 문서 필드 가 있는 컬렉션 만들어 일대일 관계 모델링할 수 있습니다. 하이버네이트 ORM 확장을 사용하면 @Struct 애그리게이션 임베더블을 사용하여 내장된 문서 필드를 생성할 수 있습니다.

이 예시에서는 이 가이드의 엔터티 정의 예시 와 유사한 엔터티에 @Struct 애그리게이션 임베딩 가능 유형이 있는 필드를 정의합니다. 샘플 Movie.java 클래스에는 다음 정보가 포함되어 있습니다.

  • @Entity 및 엔티티를 정의하고 이를 movies 컬렉션 에 매핑하는 @Table 주석

  • @Id 및 id 필드 기본 키 지정하는 @ObjectIdGenerator 주석

  • 영화의 제목을 나타내는 String 필드

  • @Struct 영화 시상 및 스튜디오 정보를 나타내는 임베딩 가능한 필드 애그리게이션

다음 예시 각 Movie 엔터티가 하나의 Awards 임베딩 가능 항목 및 하나의 Studio 임베딩 가능 항목과 연결되어 있으므로 일대일 관계 나타냅니다.

@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 에서는 내장된 문서 목록을 저장하는 컬렉션 필드 정의하여 일대다 관계 모델링할 수 있습니다. 하이버네이트 ORM 확장을 사용하면 @Struct 애그리게이션 임베더블 목록을 사용하여 내장된 문서 필드를 생성할 수 있습니다.

이 예시에서는 이 가이드의 엔터티 정의 예시 와 유사하게 엔터티에 @Struct 애그리게이션 임베더블 목록을 저장하는 필드를 정의합니다. 샘플 Movie.java 클래스에는 다음 정보가 포함되어 있습니다.

  • @Entity 및 엔티티를 정의하고 이를 movies 컬렉션 에 매핑하는 @Table 주석

  • @Id 및 id 필드 기본 키 지정하는 @ObjectIdGenerator 주석

  • 영화의 제목을 나타내는 String 필드

  • 작성기 정보를 나타내는 여러 Writer @Struct 애그리게이션 임베더블을 저장하는 목록 필드

다음 예시 각 Movie 엔터티가 여러 Writer 임베더블과 연결되어 있으므로 일대다 관계 나타냅니다.

@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 }

flattened embeddable을 @Struct aggregate embeddable 내에 중첩할 수 있습니다. flattened embeddable은 @Embeddable 주석은 포함하지만 @Struct 주석은 포함하지 않는 클래스입니다. Hibernate ORM 확장은 flattened embeddable의 필드를 별도의 중첩된 문서가 아닌 부모 내장된 문서의 필드로 저장합니다.

다음 샘플 코드는 Address 평면화된 임베딩 가능 항목을 필드로 포함하는 Studio @Struct 애그리게이션 임베딩 가능 항목을 생성합니다.

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

다음 샘플 코드는 Address 평면화된 임베딩 가능 항목을 생성합니다. 이 클래스는 @Struct 주석을 생략합니다.

@Embeddablepublic class Address { private String city; private String country; public Address() { } public Address(String city, String country) { this.city = city; this.country = country; } // Getter and setter methods }

Studio 필드를 포함하는 엔티티를 유지하면 Address 필드가 Studio 필드의 내장된 문서의 필드가 됩니다. 다음 예시 문서에는 Address 평면화된 임베더블의 필드를 저장하는 studio 라는 Studio 필드가 있습니다.

{ "_id": { "$oid": "..." }, "title": "Breathless", "studio": { "name": "Les Films Impéria", "city": "Paris", "country": "France" }}

클래스 계층 구조를 MongoDB 컬렉션에 매핑하는 방법을 알아보려면 엔터티 상속 계층 구조 매핑 가이드를 참조하세요.

엔터티를 사용하여 데이터베이스 작업을 실행 방법을 학습 데이터와의 상호 작용 섹션에서 다음 가이드를 참조하세요.

최대 절전 모드 ORM 필드에 대해 자세히 학습하려면 최대 절전 모드 ORM 문서의 매핑 유형 섹션을 참조하세요.

최대 절전 모드 ORM 엔터티에 대해 자세히 학습하려면 최대 절전 모드 ORM 문서에서 POJO 모델 을 참조하세요.