Hibernate OGM を使用して Hibernate と MongoDB を統合する

Mehvish Ashiq 2024年2月15日
  1. MongoDB の Hibernate OGM
  2. HibernateOGM を使用することの重要性
  3. Hibernate OGM を使用して Hibernate を MongoDB と統合する
Hibernate OGM を使用して Hibernate と MongoDB を統合する

この記事では、Hibernate Object / Grid Mapper(OGM)の重要性を学び、それを使用して Hibernate を MongoDB と統合します。

MongoDB の Hibernate OGM

Hibernate Object / Grid Mapper(OGM)は、NoSQL データストアの Java Persistence API(JPA)サポートを提供します。NoSQL は、子のさまざまなデータストレージをすべて網羅する親用語であることを忘れないでください。

たとえば、ドキュメント、Key-Value、グラフ指向、列指向のデータストアが含まれます。

HibernateOGM を使用することの重要性

その重要性を理解するには、基本レベルでリレーショナルデータベース、Hibernate および MongoDB を知っている必要があります。すべての基本的な知識があると仮定します(少なくとも 1つのリレーショナルデータベース、Hibernate と MongoDB)。

Hibernate は、Java オブジェクト、より正確にはプロパティ(フィールドとも呼ばれます)をデータベーステーブルの列にマップします。students が複数の courses を持つことができる例を見てみましょう。

リレーショナルデータベースでは、students テーブルと courses テーブルを含めることでこれをモデル化できます。このテーブルでは、courses テーブルの複数のエントリを students テーブルの 1 人の学生にマップできます。

create table students {
    id integer(10),
    name varchar(100),
    department varchar(100)
}

create table courses {
    id integer(10),
    course1 varchar(50),
    course2 varchar(50),
}

create table student_courses {
    student_id  integer(10),
    course_id  integer(10)
}

Java でも同様の関係を表すことができます。次のようになります。

@OneToMany(cascade=CascadeType.ALL)
  @JoinTable(name="student_courses", joinColumns={@JoinColumn(name="student_id ", referencedColumnName="id")}
  , inverseJoinColumns={@JoinColumn(name="course_id", referencedColumnName="id")})
  private Set<CoursesEntity> courses;

MongoDB は NoSQL データベースですが、キーと値のペアを介してデータを保存およびアクセスします。値セクションは、JSON/XML 形式のドキュメントとして保存されることに注意してください。

前の studentscourses の例を保存すると、MongoDB では次のようになります。

{
    id: 1,
    name: "John",
    department: "Comptuer Science"
    courses: [
        {
            course1: "C Programming",
            course2: "Machine Learning"
        },
        {
            course1: "Recommender Systems",
            course2: "Data Science"
        }
   ]
}

MongoDB には、さらに深く掘り下げることができるネストされたフィールドがあることがわかるので、従来の方法に従って Java フィールド/プロパティをドキュメントにマップすることによって MongoDB で Hibernate を使用することはできません。

ここで、オブジェクト/グリッドマッパー(OGM)が必要になります。Hibernate は、その機能と機能を拡張して NoSQL データストア(MongoDB など)をサポートする OGM エンジン実装を提供します。

OGM には、Java Persistence API(JPA)とも呼ばれる Java Persistence Query Language(JPQL)とともに、特定の NoSQL データベースの言語のネイティブクエリを使用してデータをクエリするという利点もあります。

OGM を使用する主な利点は、NoSQL およびリレーショナルデータストア間での Java Persistence API の一貫性です。Hibernate OGM は、GridDialectDatastoreProvider という 2つの主要なインターフェイスにより、さまざまな NoSQL データストアを抽象化できます。

これが、Hibernate OGM でサポートされるすべての新しい NoSQL データストアに、DatastoreProvider および GridDialect インターフェイスの実装が付属している理由です。

現在のところ、Hibernate OGM はすべての NoSQL データストアをサポートしているわけではありませんが、Infinispan(キー値)、Neo4j(グラフ)、MongoDB(ドキュメント)など、多くの NoSQL データストアを処理できます。

Hibernate OGM を使用して Hibernate を MongoDB と統合する

Hibernate を MongoDB と統合するために HibernateOGM を使用するには、以下を設定する必要があります。

  1. Java(Java 18.0.1.1 を使用しています)。
  2. MongoDB サーバー(MongoDB 5.0.8 を使用しています)。
  3. コードエディタまたは JavaIDE(Apache NetBeans IDE 13 を使用)。
  4. Maven または Gradle を使用した依存関係(Maven を使用しています)。

ここでは、Student というクラスを作成して Entity として扱い、Student クラスのプロパティを MongoDB の field 名として扱います。Java のクラスとエンティティ、プロパティとフィールドを対応させるためにアノテーションを使います。

まず、そのために必要なファイルを準備しましょう。pom.xml ファイルを作成します(このファイルには、必要なすべての依存関係が含まれています)。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.voidtesting.hibernatewithmongodbusingogm</groupId>
    <artifactId>HibernateWithMongoDBUsingOGM</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
        <exec.mainClass>
            <!--this name will be on single line, we are splitting it
            for readability purpose-->
            com.voidtesting.hibernatewithmongodbusingogm
            .HibernateWithMongoDBUsingOGM
        </exec.mainClass>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.3.6.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate.ogm</groupId>
            <artifactId>hibernate-ogm-mongodb</artifactId>
            <version>5.4.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.jboss.narayana.jta</groupId>
            <artifactId>narayana-jta</artifactId>
            <version>5.9.2.Final</version>
            <type>jar</type>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.2</version>
        </dependency>

        <dependency>
            <groupId>org.parboiled</groupId>
            <artifactId>parboiled-java</artifactId>
            <version>1.4.1</version>
        </dependency>

        <dependency>
            <groupId>org.jboss.jbossts</groupId>
            <artifactId>jbossjta</artifactId>
            <version>4.16.4.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.9.Final</version>
        </dependency>

    </dependencies>
</project>

persistence.xml ファイルを記述します(ここでは、指定された JPA 永続ユニットを構成します):

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="ogmdemo" transaction-type="JTA">
        <!-- Use the Hibernate OGM provider: configuration will be transparent -->
        <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
        <class>com.voidtesting.hibernatewithmongodbusingogm.Student</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>
           <property name="hibernate.transaction.jta.platform"
           value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"
           />
           <!--
           Here you will pick which NoSQL technology to use, and configure it;
           in this example we use MongoDB.
           -->
           <property name="hibernate.ogm.datastore.provider" value="MONGODB"/>
           <!-- Define MongoDB access parameters here. -->
           <property name="hibernate.ogm.datastore.host" value="127.0.0.1"/>
           <property name="hibernate.ogm.datastore.port" value="27017"/>
           <property name="hibernate.ogm.datastore.create_database" value="true"/>
           <property name="hibernate.ogm.datastore.database"
                     value="HibernateMongoDBDemo"/>

     </properties>
  </persistence-unit>
</persistence>

src/main/resources/META-INF ディレクトリに persistence.xml ファイルがあることを確認してください。そうしないと、エラーが発生する可能性があります。

Student.java クラスを作成します(このクラスはエンティティとしてマップされ、その変数は MongoDB のフィールドとしてマップされます):

package com.voidtesting.hibernatewithmongodbusingogm;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Student implements Serializable {
  @Id public int id;
  public String name;

  public Student(int id, String name) {
    this.id = id;
    this.name = name;
  }

  public Student() {}

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

アノテーション@Entity@Id を使用して、このクラスのエンティティを作成する MongoDB に、主キーが id になる Student という名前を付けていることに気付くかもしれません。すべての JPA アノテーションはここにあります。

Java メインクラスを作成します。

package com.voidtesting.hibernatewithmongodbusingogm;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class HibernateWithMongoDBUsingOGM {
  public static void main(String args[]) {
    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ogmdemo");
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();
    // perform operations here
    Student std = new Student(1, "Mehvish Ashiq");
    entityManager.persist(std);
    entityManager.getTransaction().commit();
    entityManager.close();
    entityManagerFactory.close();
  }
}

これは、Java プロジェクトでのすべてのファイルの正しい場所を知るためのスクリーンショットです。

hibernate ogm を使用して hibernate を mongodb と統合します-すべてのファイル

次に、プログラムを実行します。次の出力を観察して、実行方法を確認し、すべてが正常に機能していることを確認できます。

出力:

hibernateogm を使用して hibernate を mongodb と統合します-最終出力

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook