Docs Menu
Docs Home
/ /

CRUD 操作を実行

In this guide, you can learn how to use the MongoDB Extension for Hibernate ORM to run create, read, update, and delete (CRUD) operations on your MongoDB collections.

このガイドの例では、Movie sample_mflix.moviesAtlasサンプルデータセットの コレクションを表す エンティティを使用します。Movie エンティティには次の定義があります。

import com.mongodb.hibernate.annotations.ObjectIdGenerator;
import org.bson.types.ObjectId;
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 String[] cast;
public Movie(String title, String plot, int year, 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 String[] getCast() {
return cast;
}
public void setCast(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;

To use an EntityManager, you must create a persistence.xml file that declares a persistence unit. To learn more, see the Tutorial using JPA-standard APIs in the Hibernate ORM documentation.

ドキュメントをコレクションに挿入するには、新しい エンティティインスタンスを作成します。次に、このインスタンスを次のメソッドの引数として渡して、ドキュメントとしてMongoDBコレクションに保存します。

  • org.hibernate.Session.persist(): Hibernetes API を使用して変更をデータベースに適用

  • jakarta.persistence.EntityManager.persist(): Javaリスト 永続化API を使用して変更をデータベースに適用

Tip

エンティティ インスタンスを作成し、それをデータベースに永続化する方法の詳細については、 Hibernetes ORM ユーザーガイドの「 エンティティの永続化 」を参照してください。

次の例では、新しい Movie エンティティインスタンスを作成し、persist() メソッドを使用して対応するドキュメントをsample_mflix.moviesコレクションに挿入します。

var myMovie = new Movie();
myMovie.setTitle("Knives Out");
myMovie.setYear(2019);
myMovie.setCast(new String[]{"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(new String[]{"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() メソッドを提供します。

  • 非表示の Session API: 非表示クエリ言語(HQL)構文を使用してクエリを定義する

  • Java 永続性の EntityManager API: クエリを定義するには、HQL のサブセットである Java 永続性クエリ言語(JavaQL)構文 を使用します

Tip

HQL および JQL構文 を使用してデータを検索する方法の詳細については、 非表示 ORM クエリガイドの [ 選択ステートメント ] を参照してください。

注意

このセクションでは、HQL と JQL を使用してドキュメントを読み取る方法について説明しますが、基準ビルダまたはネイティブ クエリを使用してデータを取得することもできます。詳しくは、次のガイドを参照してください。

クエリ条件に一致するドキュメントを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

Tip

クエリ構文

HQL および JQL の構文 の詳細については、非表示の ORM ドキュメントの「 非表示のクエリ言語へのガイド 」を参照してください。

次の例では、セッションで 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 を使用してデータを変更する方法の詳細については、次のリソースを参照してください。

  • Hibernetes ORM ユーザーガイドでの管理状態または永続的な状態の変更

  • 非表示 ORM クエリガイドの更新ステートメント

次の例では、 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

次の操作を実行して、コレクションからドキュメントを削除できます。

  • 1 つのドキュメントを削除します remove()。セッション マネージャーまたはエンティティ マネージャーで、削除するエンティティインスタンスを引数として渡して、 メソッドを呼び出します。

  • 複数のドキュメントを削除:createQuery() createMutationQuery()セッション マネージャーまたはエンティティ マネージャーの またはexecuteUpdate() メソッドに delete ステートメントを渡します。次に、 メソッドを呼び出して、変更をデータベースに適用します。

Tip

Hibernetes ORM を使用してデータを削除する方法の詳細については、次のリソースを参照してください。

  • Hibernetes ORM ユーザーガイドでのエンティティの削除

  • 非表示 ORM クエリガイドの Delete ステートメント

次の例では、 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

Hibernetes ORM を使用してCRUD操作を実行する方法の詳細については、次のリソースを参照してください。

  • Hibernetes ORM ユーザーガイドの永続性コンテキスト

  • 非表示 ORM クエリガイドのステートメント タイプ

作成、読み取り、アップデート、削除の例をさらに見るには、「 使い始める 」チュートリアルの次のセクションを参照してください。

Hibernetes ORM 拡張機能を使用してクエリを実行する方法の詳細については、次のガイドを参照してください。

戻る

エンティティの作成

項目一覧