Overview
このガイドでは、 Hibernetes ORM 用のMongoDB拡張機能 を使用して、 MongoDBコレクションに対して作成、読み取り、アップデート、および削除( CRUD )操作を実行する方法を学習します。
サンプル データ
このガイドの例では、Movie sample_mflix.moviesAtlasサンプルデータセットの コレクションを表す エンティティを使用します。 。Movie エンティティには次の定義があります。
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; } }
Hibernetes ORM 用のMongoDB拡張機能を使用してこのMongoDBサンプルコレクションと交流するJavaアプリケーションを作成する方法については、使い始めるチュートリアルを参照してください。
重要
永続性コンテキスト
Hibernetes ORM を有効にしてデータベースを操作するには、 Hibernetes Session または Java 永続性 EntityManager を使用して永続性コンテキスト内で操作を実行する必要があります。 MongoDBデータを変更し、データの整合性を維持するには、トランザクション内で書込み操作も実行する必要があります。
このガイドの例を実行する前に、次のコードのような永続性コンテキストとトランザクションマネジメントコードをアプリケーションに追加していることを確認してください。
var sf = HibernateUtil.getSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); // ... Perform CRUD operations here tx.commit(); session.close(); sf.close();
セッションを使用するには、HibernateUtil.java を構成するSessionFactory ファイルを作成する必要があります。詳細については、「 使い始める 」チュートリアルの「 アプリケーションを構成する 」の手順を参照してください。
// Replace <persistence unit> with the name of your persistence unit in the persistence.xml file EntityManagerFactory emf = Persistence.createEntityManagerFactory("<persistence unit>"); EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); // ... Perform CRUD operations here entityManager.getTransaction().commit(); entityManager.close(); emf.close;
EntityManagerpersistence.xmlを使用するには、永続性ユニットを宣言する ファイルを作成する必要があります。詳しくは、 Hibernetes ORM ドキュメントの「 JPA 標準 API を使用するチュートリアル 」を参照してください。
ドキュメントの挿入
ドキュメントをコレクションに挿入するには、新しい エンティティインスタンスを作成します。次に、このインスタンスを次のメソッドの引数として渡して、ドキュメントとしてMongoDB コレクションに保存します。
org.hibernate.Session.persist(): Hibernetes API を使用して変更をデータベースに適用jakarta.persistence.EntityManager.persist(): Javaリスト 永続化API を使用して変更をデータベースに適用
Tip
エンティティ インスタンスを作成し、それをデータベースに永続化する方法の詳細については、Hibernate ORM ユーザーガイドの「エンティティの永続化」を参照してください。
例
次の例では、新しい Movie エンティティインスタンスを作成し、persist() メソッドを使用して対応するドキュメントをsample_mflix.moviesコレクションに挿入します。
var myMovie = new Movie(); myMovie.setTitle("Knives Out"); myMovie.setYear(2019); myMovie.setCast(List.of("Ana de Armas", "Daniel Craig", "Chris Evans")); myMovie.setPlot("Detective Benoit Blanc investigates the mysterious death of crime novelist Harlan Thrombey, " + "unraveling lies as every Thrombey family member becomes a suspect."); session.persist(myMovie);
var myMovie = new Movie(); myMovie.setTitle("Knives Out"); myMovie.setYear(2019); myMovie.setCast(List.of("Ana de Armas", "Daniel Craig", "Chris Evans")); myMovie.setPlot("Detective Benoit Blanc investigates the mysterious death of crime novelist Harlan Thrombey, " + "unraveling lies as every Thrombey family member becomes a suspect."); entityManager.persist(myMovie);
ドキュメントを読む
コレクションからドキュメントを検索するには 、クエリ条件を createQuery() メソッドに渡します。次の API は両方とも createQuery() メソッドを提供します。
非表示の
SessionAPI: 非表示クエリ言語(HQL)構文を使用してクエリを定義するJava 永続性の
EntityManagerAPI: クエリを定義するには、HQL のサブセットである Java 永続性クエリ言語(JavaQL)構文 を使用します
Tip
HQL および JQL構文を使用してデータを検索する方法の詳細については、 非表示 ORM クエリガイドの 選択ステートメント を参照してください。
注意
このセクションでは、HQL と JQL を使用してドキュメントを読み取る方法について説明しますが、基準ビルダまたはネイティブ クエリを使用してデータを取得することもできます。詳しくは、次のガイドを参照してください。
1 つのドキュメントの例を返す
クエリ条件に一致するドキュメントを1つだけ検索するには、getSingleResult() メソッドを createQuery() メソッドにチェーンします。次の例では、sample_mflix.moviesコレクションから、title 値が "Boyhood" であるドキュメントを1つ検索します。
var singleResult = session.createQuery("from Movie where title = :t", Movie.class) .setParameter("t", "Boyhood") .getSingleResult(); System.out.println("Title: " + singleResult.getTitle() + ", Year: " + singleResult.getYear());
Title: Boyhood, Year: 2014
var singleResult = entityManager.createQuery("select m from Movie m where m.title = :t", Movie.class) .setParameter("t", "Boyhood") .getSingleResult(); System.out.println("Title: " + singleResult.getTitle() + ", Year: " + singleResult.getYear());
Title: Boyhood, Year: 2014
複数のドキュメントを返す例
次の例では、セッションで createQuery() メソッドを呼び出して、sample_mflix.moviesコレクションからドキュメントを検索します。このコードでは、HQL と JQL を使用して、year の値が 1920 であるドキュメントを返し、その title 値を出力します。
var results = session.createQuery("from Movie where year = :y", Movie.class) .setParameter("y", 1920) .getResultList(); results.forEach(movie -> System.out.println(movie.getTitle()));
High and Dizzy One Week The Saphead The Daughter of Dawn
var results = entityManager.createQuery("select m from Movie m where m.year = :y", Movie.class) .setParameter("y", 1920) .getResultList(); results.forEach(movie -> System.out.println(movie.getTitle()));
High and Dizzy One Week The Saphead The Daughter of Dawn
ドキュメントの変更
コレクション内のドキュメントを変更するには、次の操作を実行します。
1 つのドキュメントを更新 : エンティティの setter メソッドを呼び出して 1 つのエンティティインスタンスのフィールド値を変更し、セッションまたはエンティティ マネージャーを使用して変更を永続化します。
複数のドキュメントを更新:
createQuery()createMutationQuery()セッション マネージャーまたはエンティティ マネージャーのexecuteUpdate()メソッドまたは メソッドに更新ステートメントを渡します。次に、 メソッドを呼び出して、変更をデータベースに適用します。
Tip
Hibernetes ORM を使用してデータを変更する方法の詳細については、次のリソースを参照してください。
更新 1 つの例
次の例では、ObjectId 値でドキュメントを検索する。次に、この例ではMovie エンティティの setTitle() メソッドを呼び出して、ドキュメントの title 値を "Jurassic Park I" に更新します。
// Your ObjectId value might differ Movie movieById = session.get(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); movieById.setTitle("Jurassic Park I"); session.persist(movieById);
// Your ObjectId value might differ Movie movieById = entityManager.find(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); movieById.setTitle("Jurassic Park I"); entityManager.persist(movieById);
複数の更新例
次の例では、一致するドキュメントの title の値を "The Three Stooges" から "The 3 Stooges" に更新します。次に、この例ではexecuteUpdate() メソッドを呼び出して、データベースに変更を適用します。
var updateResult = session.createMutationQuery( "update Movie set title = :new where title = :old") .setParameter("new", "The 3 Stooges") .setParameter("old", "The Three Stooges") .executeUpdate(); System.out.println("Number of movies updated: " + updateResult);
Number of movies updated: 2
var updateResult = entityManager.createQuery( "update Movie m set m.title = :new where m.title = :old") .setParameter("new", "The 3 Stooges") .setParameter("old", "The Three Stooges") .executeUpdate(); System.out.println("Number of movies updated: " + updateResult);
Number of movies updated: 2
Delete Documents
次の操作を実行して、コレクションからドキュメントを削除できます。
1 つのドキュメントを削除します
remove()。セッション マネージャーまたはエンティティ マネージャーで、削除するエンティティインスタンスを引数として渡して、 メソッドを呼び出します。複数のドキュメントを削除する: セッション マネージャーまたはエンティティ マネージャーの
createQuery()またはcreateMutationQuery()メソッドに 削除ステートメント を渡します。次に、executeUpdate()メソッドを呼び出して、変更をデータベースに適用します。
Tip
Hibernetes ORM を使用してデータを削除する方法の詳細については、次のリソースを参照してください。
非表示 ORM クエリガイドの Delete ステートメント
削除の例 1 つ
次の例では、ObjectId 値でドキュメントを検索する。次に、この例ではセッションで remove() メソッドを呼び出して、sample_mflix.moviesコレクションから対応するドキュメントを削除します。
// Your ObjectId value might differ Movie movieToDelete = session.get(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); session.remove(movieToDelete);
// Your ObjectId value might differ Movie movieToDelete = entityManager.find(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); entityManager.remove(movieToDelete);
削除の複数の例
次の例では、sample_mflix.moviesコレクションから year 値が 1920 であるすべてのドキュメントを削除します。この例ではステートメントを削除するために createMutationQuery() メソッドに渡し、executeUpdate() メソッドを呼び出してデータベースに変更を適用します。
var deleteResult = session.createMutationQuery( "delete Movie where year = :y") .setParameter("y", 1920) .executeUpdate(); System.out.println("Number of movies deleted: " + deleteResult);
Number of movies deleted: 4
var deleteResult = entityManager.createQuery( "delete Movie m where m.year = :y") .setParameter("y", 1920) .executeUpdate(); System.out.println("Number of movies deleted: " + deleteResult);
Number of movies deleted: 4
詳細情報
Hibernate ORM を使用してCRUD操作を実行する方法の詳細については、次のリソースを参照してください。
作成、読み取り、更新、削除するの例をさらに見るには、「 使い始める 」チュートリアルの次のセクションを参照してください。
Hibernate ORM 拡張機能を使用してクエリを実行する方法の詳細については、次のガイドを参照してください。