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
形式のドキュメントとして保存されることに注意してください。
前の students
と courses
の例を保存すると、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 は、GridDialect
と DatastoreProvider
という 2つの主要なインターフェイスにより、さまざまな NoSQL データストアを抽象化できます。
これが、Hibernate OGM でサポートされるすべての新しい NoSQL データストアに、DatastoreProvider
および GridDialect
インターフェイスの実装が付属している理由です。
現在のところ、Hibernate OGM はすべての NoSQL データストアをサポートしているわけではありませんが、Infinispan
(キー値)、Neo4j
(グラフ)、MongoDB
(ドキュメント)など、多くの NoSQL データストアを処理できます。
Hibernate OGM を使用して Hibernate を MongoDB と統合する
Hibernate を MongoDB と統合するために HibernateOGM を使用するには、以下を設定する必要があります。
- Java(Java 18.0.1.1 を使用しています)。
- MongoDB サーバー(MongoDB 5.0.8 を使用しています)。
- コードエディタまたは JavaIDE(Apache NetBeans IDE 13 を使用)。
- 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 プロジェクトでのすべてのファイルの正しい場所を知るためのスクリーンショットです。
次に、プログラムを実行します。次の出力を観察して、実行方法を確認し、すべてが正常に機能していることを確認できます。
出力: