Hibernate OGM을 사용하여 Hibernate와 MongoDB 통합

Mehvish Ashiq 2024년2월15일
  1. MongoDB의 최대 절전 모드 OGM
  2. Hibernate OGM 사용의 중요성
  3. Hibernate OGM을 사용하여 Hibernate와 MongoDB 통합
Hibernate OGM을 사용하여 Hibernate와 MongoDB 통합

이 기사에서 우리는 Hibernate Object/Grid Mapper(OGM)의 중요성을 배우고 Hibernate를 MongoDB와 통합하는 데 사용할 것입니다.

MongoDB의 최대 절전 모드 OGM

Hibernate OGM(Object/Grid Mapper)은 NoSQL 데이터 저장소에 대한 JPA(Java Persistence API) 지원을 제공합니다. NoSQL은 모든 하위 다양한 데이터 스토리지를 포괄하는 상위 용어임을 기억하십시오.

예를 들어 문서, 키-값, 그래프 지향 및 열 지향 데이터 저장소가 포함됩니다.

Hibernate OGM 사용의 중요성

그 중요성을 이해하려면 기본 수준에서 관계형 데이터베이스, Hibernate 및 MongoDB를 알아야 합니다. 모든 것에 대한 기본 지식이 있다고 가정합니다(최소한 하나의 관계형 데이터베이스, Hibernate 및 MongoDB).

Hibernate는 Java 객체, 보다 정확하게는 속성(필드라고도 함)을 데이터베이스 테이블의 열에 매핑합니다. students가 여러 courses를 가질 수 있는 예를 들어보겠습니다.

관계형 데이터베이스에서 courses 테이블의 여러 항목이 students 테이블의 한 학생에 매핑될 수 있는 studentscourses 테이블을 포함하여 이를 모델링할 수 있습니다.

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(Object/Grid Mapper)이 필요합니다. Hibernate는 MongoDB와 같은 NoSQL 데이터 저장소를 지원하도록 기능과 특징을 확장하는 OGM 엔진 구현을 제공합니다.

OGM은 또한 JPA(Java Persistence API)라고도 하는 JPQL(Java Persistence Query Language)과 함께 특정 NoSQL 데이터베이스 언어의 기본 쿼리를 사용하여 데이터를 쿼리하는 이점을 제공합니다.

OGM 사용의 주요 이점은 NoSQL 및 관계형 데이터 저장소에서 Java Persistence API의 일관성입니다. Hibernate OGM은 GridDialectDatastoreProvider라는 두 가지 주요 인터페이스로 인해 다양한 NoSQL 데이터 저장소에 대한 추상화를 제공할 수 있습니다.

이것이 Hibernate OGM이 지원하는 모든 새로운 NoSQL 데이터 저장소가 DatastoreProviderGridDialect 인터페이스의 구현과 함께 제공되는 이유입니다.

현재 Hibernate OGM이 모든 NoSQL 데이터 저장소를 지원하지는 않지만 Infinispan(키-값), Neo4j(그래프) 및 MongoDB(문서)를 포함한 많은 데이터 저장소와 작업할 수 있습니다.

Hibernate OGM을 사용하여 Hibernate와 MongoDB 통합

Hibernate를 MongoDB와 통합하기 위해 Hibernate OGM을 사용하려면 다음을 설정해야 합니다.

  1. 자바(자바 18.0.1.1 사용).
  2. MongoDB 서버(MongoDB 5.0.8 사용).
  3. 코드 편집기 또는 Java IDE(Apache NetBeans IDE 13 사용).
  4. Maven 또는 Gradle을 사용한 종속성(우리는 Maven을 사용하고 있음).

여기에서 Entity로 취급되는 Student라는 클래스를 만들고 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 주석은 여기에서 찾을 수 있습니다.

자바 메인 클래스 생성:

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 프로젝트에서 모든 파일의 정확한 위치를 알 수 있는 스크린샷입니다.

최대 절전 모드 ogm을 사용하여 최대 절전 모드를 mongodb와 통합 - 모든 파일

이제 프로그램을 실행합니다. 다음 출력을 관찰하여 실행 방법을 확인하고 모든 것이 제대로 작동하는지 확인할 수 있습니다.

출력:

최대 절전 모드 ogm을 사용하여 최대 절전 모드를 mongodb와 통합 - 최종 출력

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