Overview
このガイドでは、MongoDBコレクションを表すHibernate ORM エンティティを作成する方法を学びます。Entity は、データの構造を定義するJavaクラスです。Hibernate ORM 拡張機能を使用する場合、各エンティティをMongoDBコレクションにマッピングし、これらのエンティティを使用してコレクションのドキュメントと交流できます。
Tip
Entity チュートリアル
エンティティと Hibernate ORM 拡張機能を使用して 1 対多の関係をモデル化する方法を示すチュートリアルについては、「Hibernate ORM と MongoDB を使用した関係のモデリング」の Foojay ブログ記事をご覧ください。
MongoDB BSONフィールド
MongoDB、 BSONと呼ばれるバイナリ形式でドキュメントを整理して保存し、柔軟なデータ処理を可能にしています。このセクションでは、エンティティに含めることができるBSONフィールドに対するHibernate ORM拡張機能のサポートについて説明します。
Tip
MongoDB がBSONデータを保存する方法の詳細については、 MongoDB Serverマニュアルの「 BSON types 」を参照してください。
次の表では、サポートされているBSONフィールド型と、非表示の ORM エンティティで使用できる非表示の ORM 拡張機能について説明しています。
BSONフィールド型 | 拡張フィールドタイプ | BSON の説明 |
|---|---|---|
|
| Represents a null value or absence of data. |
|
| Stores binary data with subtype 0. |
|
| Stores UTF-8 encoded string values. |
|
| Stores 32-bit signed integers. |
|
| Stores 64-bit signed integers. |
|
| Stores floating-point values. |
|
| Stores true or false values. |
|
| Stores 28-bit decimal values. |
|
| Stores unique 12-byte identifiers that MongoDB uses as primary keys. |
|
| Stores dates and times as milliseconds since the Unix epoch. |
|
| Stores embedded documents with field values mapped according to their respective
types. @Struct aggregate embeddables might also contain array or Collection
attributes. |
|
| Stores array values with elements mapped according to their respective types. Character arrays require setting the hibernate.type.wrapper_array_handling configuration property. |
エンティティを定義する
MongoDBコレクションを表すエンティティを作成するには、プロジェクトの基本パッケージディレクトリに新しいJavaファイルを作成し、新しいファイルにエンティティクラスを追加します。エンティティクラスで、保存するフィールドとコレクション名を指定します。@jakarta.persistence.Table アノテーションの name 要素はMongoDBコレクション名を表します。エンティティを定義するには、次の構文を使用します。
public class <EntityName> { private ObjectId id; // 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クラスを Hibernetes ORM エンティティとしてマークする注釈@TableAtlasサンプルデータセットからエンティティをmoviesコレクションにマッピングする注釈@Idとidフィールドをプライマリキーとして指定し、ObjectIdの自動生成を構成する@ObjectIdGenerator注釈映画データを表すプライベート フィールド
エンティティインスタンス化のためのデフォルトおよびパラメータ付きコンストラクタ
エンティティのフィールドへのアクセスを提供する 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; public class Movie { 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; } }
Tip
エンティティクラス定義で使用されるフィールドの詳細については、このガイドのMongoDB BSONフィールドセクションを参照してください。
埋め込みデータ
Hibernetes ORM 拡張機能は、 Hibernetes ORM @Embeddable 注釈による埋め込みドキュメントをサポートします。埋め込みドキュメントを使用すると、 MongoDBドキュメント内に 1 対多、多対 1、1 対 1 の関係を作成できます。この形式は、頻繁にアクセスされるデータを表現するのに最適です。
埋め込みドキュメントを表すには、クラスで @Struct と @Embeddable アノテーションを使用して @Struct 集計埋め込み可能を作成します。次に、親エンティティに埋め込み可能な型をフィールドとして含めます。Hibernetes ORM 拡張機能は、埋め込み可能な単一オブジェクト、配列、およびコレクションの埋め込みをサポートしています。
Tip
@Struct集計埋め込み可能ファイルの詳細については、 Hibernetes ORM ドキュメントの @Strict 集計埋め込み可能マッピングを参照してください。
1 対 1 の関係
1 対 1 の関係とは、1 つのデータベースのレコードが別のデータベースの 1 つのレコードのみに関連付けられている場合を指します。MongoDBでは、埋め込みドキュメントフィールドを持つコレクションを作成して、1 対 1 の関係をモデル化できます。Hibernetes ORM 拡張機能では、@Struct 集計埋め込み可能ファイルを使用して埋め込みドキュメントフィールドを作成できます。
この例では、このガイドのエンティティの定義の例と同様に、エンティティ内に @Struct 集計埋め込み可能型を持つフィールドを定義します。サンプルMovie.java エンティティクラスには、次の情報が含まれています。
@Entityエンティティを定義し、それをmoviesコレクションにマッピングする@Tableアノテーション@Ididフィールドをプライマリキーとして指定する@ObjectIdGenerator注釈映画のタイトルを表す Stringフィールド
@Struct映画情報とチームの情報を表す集計埋め込みフィールド
次の例は1 対 1 の関係を表します。各 Movie エンティティは 1 つの Awards 埋め込み可能と 1 つの Studio 埋め込み可能に関連付けられているためです。
public class Movie { 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 集計埋め込み可能を作成します。
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 集計埋め込み可能を作成します。
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 }
1 対多の関係
1 対多の関係とは、1 つのデータベースのレコードが別のデータベースの多くのレコードに関連付けられている場合を指します。 MongoDBでは、埋め込みドキュメントのリストを保存するコレクションフィールドを定義して、 1 対多の関係をモデル化できます。 Hibernetes ORM 拡張機能を使用すると、@Struct 集計埋め込み可能ファイルのリストを使用して埋め込みドキュメントフィールドを作成できます。
この例では、このガイドの エンティティの定義例 と同様に、エンティティに @Struct 集計埋め込み可能ファイルのリストを保存するフィールドを定義します。サンプルMovie.java エンティティクラスには、次の情報が含まれています。
@Entityエンティティを定義し、それをmoviesコレクションにマッピングする@Tableアノテーション@Ididフィールドをプライマリキーとして指定する@ObjectIdGenerator注釈映画のタイトルを表す Stringフィールド
複数の
Writer@Struct集計埋め込み可能性を保存するリストフィールド。これは書込み情報を表す
次の例は1 対多の関係を表しています。各 Movie エンティティは複数の Writer 埋め込み可能に関連付けられているためです。
public class Movie { 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 集計埋め込み可能を作成します。
public class Writer { private String name; public Writer() { } public Writer(String name) { this.name = name; } // Getter and setter methods }
詳細情報
エンティティを使用してデータベース操作を実行する方法については、「 データの操作 」セクションにある次のガイドを参照してください。
Hibernetes ORM フィールドの詳細については、 Hibernetes ORM ドキュメントの「 マッピング型 」セクションを参照してください。
Hibernetes ORM エンティティの詳細については、 Hibernetes ORM ドキュメントの POJO モデル を参照してください。