Overview
このチュートリアルでは、Hibernate ORM拡張機能を使用して、Java Persistence API (JPA) エンティティをMongoDBに保存するSpring Bootアプリケーションを作成する方法を学ぶことができます。このアプリケーションは、Movie エンティティ、Spring Data JPAリポジトリ、およびスタートアップ時に実行するクエリを定義します。
開始する前に、「MongoDB配置の作成」および「接続文字列の作成」の手順を完了してください。これらは「Hibernate ORM拡張機能の概要」チュートリアルの一部です。これらの手順により、このチュートリアルで使用するAtlas配置、サンプルデータ、および接続文字列が作成されます。
アプリケーション スターターをインストールする
Spring Bootプロジェクトを作成する
Spring Boot 4.x プロジェクト MongoHibernateSpringQuickstart を作成します。Spring Initializr を使用してプロジェクトを生成するか、IDE で作成できます。
Spring Initializrは、MongoHibernateSpringQuickstartApplication.javaのように、プロジェクト名にちなんだメインアプリケーションクラスを生成します。Spring Initializrを使用してプロジェクトを生成する場合は、自動生成されたメインアプリケーションクラスファイルを削除してください。このチュートリアルの後半で、このプロジェクトのメインアプリケーションファイルであるMovie Applicationを作成します。プロジェクトに2つのメインアプリケーションクラスが含まれている場合、アプリケーションはUnable to find a single main classエラーで起動に失敗します。
スターター依存関係を追加する
Maven プロジェクトの場合は、次の依存関係を pom.xml ファイルに追加します。
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-hibernate-spring-boot-starter</artifactId> <version>1.0.0</version> </dependency></dependencies>Gradle プロジェクトの場合は、次の依存関係を build.gradleファイルに追加します。
dependencies { implementation("org.mongodb:mongodb-hibernate-spring-boot-starter:1.0.0")}マネージドHibernate ORMのバージョンをオーバーライドする
このスターターには、Hibernate ORM 7.4以降が必要です。Spring Bootは、BOM(Bill of Materials)を通じてHibernate ORMのバージョンをマネージドしており、一部のSpring Boot 4.xリリースでは、スターターが必要とするバージョンよりも古いHibernate ORMバージョンがマネージドされています。マネージドバージョンが7.4より前の場合、アプリケーションの起動に失敗し、Hibernate ORM拡張機能がNoSuchMethodErrorをスローします。
Mavenプロジェクトでマネージドバージョンをオーバーライドするには、pom.xmlファイルに次のプロパティを追加します。
<properties> <hibernate.version>7.4.7.Final</hibernate.version></properties>Gradle プロジェクトでマネージド バージョンを上書きするには、build.gradle ファイルに次の行を追加します。
ext['hibernate.version'] = '7.4.7.Final'インストールを完了するには、プロジェクトをリロードまたは同期してください。
アプリケーションを構成する
アプリケーションのプロパティを設定する
プロジェクトの src/main/resources ディレクトリで application.properties ファイルを開き、次のプロパティを追加します。
spring.jpa.database-platform=MongoDBspring.mongodb.uri=<connection string>spring.jpa.properties.com.mongodb.hibernate.semantics.nulls=MQL<connection string> プレースホルダーを、「接続文字列の作成」ステップで作成した sample_mflix 接続文字列に置き換えます。このステップは、「Hibernate ORM 拡張機能の概要」チュートリアルにあります。接続文字列は次の例のようになります。
mongodb+srv://<db_username>:<db_password>@<cluster>/sample_mflix?<options>設定したアプリケーションプロパティは、次の処理を行います。
spring.jpa.database-platformスターターをアクティブにします。このプロパティをMongoDBに設定しない限り、スターターは非アクティブのままです。spring.mongodb.uriスターターが再利用するMongoClientインスタンスを構成します。スターターは独自のクライアントを作成しません。spring.jpa.properties.com.mongodb.hibernate.semantics.nulls: クエリが使用するnull比較セマンティクスを宣言します。このプロパティは必須であり、サポートされている唯一の値はMQLです。
Movie エンティティを定義する
プロジェクトの src/main/java/org/example ディレクトリに Movie.java という名前のファイルを作成し、次のコードを貼り付けます。
package org.example;
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 int year;
public Movie() { }
public Movie(String title, int year) { this.title = title; this.year = year; }
public ObjectId getId() { return id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public int getYear() { return year; }
public void setYear(int year) { this.year = year; }}このエンティティは、Atlas サンプル データセットの sample_mflix.movies コレクションを表します。スターターはアプリケーションのメインパッケージをスキャンしてエンティティを探すため、エンティティを登録する必要はありません。
リポジトリを定義する
同じディレクトリに MovieRepository.java という名前のファイルを作成し、次のコードを貼り付けます。
package org.example;
import org.bson.types.ObjectId;import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface MovieRepository extends JpaRepository<Movie, ObjectId> { List<Movie> findByTitle(String title);}このスターターはSQL DataSourceなしでSpring Data JPAリポジトリを有効にするため、Spring BootがMovieRepositoryインターフェースを実装します。
アプリケーションクラスを定義する
同じディレクトリに MovieApplication.java という名前のファイルを作成し、次のコードを貼り付けます。
package org.example;
import org.springframework.boot.CommandLineRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;
@SpringBootApplicationpublic class MovieApplication {
public static void main(String[] args) { SpringApplication.run(MovieApplication.class, args); }
@Bean CommandLineRunner run(MovieRepository repository) { return args -> { for (Movie movie : repository.findByTitle("Little Women")) { System.out.println("Title: " + movie.getTitle() + ", Year: " + movie.getYear()); } }; }}このクラスは、スタートアップ時にリポジトリクエリを実行し、一致する各映画を出力します。
これらの手順を完了すると、アプリケーションのファイル構造は次のようになります。
MongoHibernateSpringQuickstart├── src│ └── main│ ├── java│ │ └── org/example│ │ ├── Movie.java│ │ ├── MovieApplication.java│ │ └── MovieRepository.java│ └── resources│ └── application.properties├── .gitignore├── pom.xml (for Maven projects)└── build.gradle (for Gradle projects)アプリケーションの実行
IDE で MovieApplication クラスを実行します。出力は次のようになります。
Title: Little Women, Year: 1949Title: Little Women, Year: 1994アプリケーションが起動しない場合は、「スタートアップエラーのトラブルシューティング」を参照して、考えられるスタートアップエラーとトラブルシューティングのヒントを確認してください。
次のステップ
JPAプロパティの設定方法、フィールド命名戦略の変更方法、およびMongoClientのカスタマイズ方法を学ぶには、「Spring Boot Starterの設定」を参照してください。
データをエンティティとしてモデル化する方法を学ぶには、「コレクションを表すエンティティの作成」を参照してください。
データをクエリする方法を学ぶには、「データと交流する」セクションを参照してください。