최대 절전 모드 OGM 가이드

1. 개요

이 튜토리얼에서는 Hibernate Object / Grid Mapper (OGM)의 기초를 살펴볼 것입니다.

Hibernate OGM은 NoSQL 데이터 저장소에 대한 JPA (Java Persistence API) 지원을 제공합니다. NoSQL은 다양한 데이터 저장소를 포괄하는 포괄적 인 용어입니다. 예를 들어 여기에는 키-값, 문서, 열 기반 및 그래프 기반 데이터 저장소가 포함됩니다.

2. Hibernate OGM의 아키텍처

Hibernate는 전통적으로 관계형 데이터베이스를위한 ORM (Object Relational Mapping) 엔진을 제공합니다. Hibernate OGM 엔진은 NoSQL 데이터 저장소를 지원하도록 기능을 확장합니다. 이를 사용하는 주요 이점은 관계형 및 NoSQL 데이터 저장소에서 JPA 인터페이스의 일관성입니다.

Hibernate OGM은 두 개의 주요 인터페이스 인 DatastoreProviderGridDialect로 인해 여러 NoSQL 데이터 저장소에 대한 추상화를 제공 할 수 있습니다. 따라서 지원하는 각각의 새로운 NoSQL 데이터 저장소는 이러한 인터페이스의 구현과 함께 제공됩니다.

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

또한 트랜잭션을 완전히 지원하고 표준 JTA 공급자와 함께 작동 할 수 있습니다. 첫째, 명시적인 구성없이 Jakarta EE 컨테이너를 통해 제공 될 수 있습니다. 또한 Java SE 환경에서 Narayana와 같은 독립형 JTA 트랜잭션 관리자를 사용할 수 있습니다.

3. 설정

이 튜토리얼에서는 Maven을 사용하여 Hibernate OGM과 함께 작동하는 데 필요한 종속성을 가져옵니다. MongoDB도 사용할 것입니다.

명확히하기 위해 튜토리얼에서 설정하는 방법을 살펴 보겠습니다.

3.1. Maven 종속성

Hibernate OGM 및 MongoDB를 사용하는 데 필요한 종속성을 살펴 보겠습니다.

 org.hibernate.ogm hibernate-ogm-mongodb 5.4.0.Final   org.jboss.narayana.jta narayana-jta 5.9.2.Final 

여기에서는 Maven을 통해 필요한 종속성을 가져옵니다.

  • MongoDB 용 Hibernate OGM 언어
  • Narayana Transaction Manager (JTA의 실제 제공 업체)

3.2. 지속성 단위

또한 Hibernate persistance.xml 에서 데이터 저장소 세부 사항정의 해야합니다 .

 org.hibernate.ogm.jpa.HibernateOgmPersistence      

여기에 제공된 정의에 유의하십시오.

  • 속성 트랜잭션 유형의 값은 "JTA"(이는 EntityManagerFactory 에서 JTA 엔티티 관리자가 필요함을 의미 함 )
  • 이다 공급자, HibernateOgmPersistence를 최대 절전 모드 OGM에 대해
  • DB와 관련된 몇 가지 추가 세부 정보 (일반적으로 데이터 원본에 따라 다름)

구성은 MongoDB가 실행 중이고 기본값으로 액세스 할 수 있다고 가정합니다. 그렇지 않은 경우 언제든지 필요한 세부 정보를 제공 할 수 있습니다. 이전 기사 중 하나는 MongoDB 설정에 대해서도 자세히 다룹니다.

4. 엔티티 정의

이제 기본 사항을 살펴 보았으므로 몇 가지 항목을 정의 해 보겠습니다. 이전에 Hibernate ORM 또는 JPA로 작업했다면 더 이상 추가 할 것이 없습니다 . 이것이 Hibernate OGM의 기본 전제입니다. 그것은 우리가 JPA의 단지 지식을 다른되는 NoSQL 데이터 저장소와 함께 작업 할 것을 약속드립니다 .

이 자습서에서는 간단한 개체 모델을 정의합니다.

Article , AuthorEditor 클래스를 관계와 함께 정의합니다 .

Java로도 정의 해 보겠습니다.

@Entity public class Article { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String articleId; private String articleTitle; @ManyToOne private Author author; // constructors, getters and setters... }
@Entity public class Author { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String authorId; private String authorName; @ManyToOne private Editor editor; @OneToMany(mappedBy = "author", cascade = CascadeType.PERSIST) private Set authoredArticles = new HashSet(); // constructors, getters and setters... }
@Entity public class Editor { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String editorId; private String editorName; @OneToMany(mappedBy = "editor", cascade = CascadeType.PERSIST) private Set assignedAuthors = new HashSet(); // constructors, getters and setters... }

이제 엔티티 클래스를 정의하고 JPA 표준 주석으로 주석을 달았습니다.

  • JPA 엔티티로 설정하는 @Entity
  • UUID가있는 엔터티에 대한 기본 키를 생성하기위한 @Id
  • 엔터티 간의 양방향 관계를 설정하기위한 @OneToMany@ManyToOne

5. 운영

이제 엔터티를 만들었으므로 엔터티에 대해 몇 가지 작업을 수행 할 수 있는지 살펴 보겠습니다. 첫 번째 단계로 테스트 데이터를 생성해야합니다. 여기에서는 Editor , Author 몇 개 , Article 몇 개를 만들겠습니다 . 우리는 또한 그들의 관계를 확립 할 것입니다.

그 후 작업을 수행하기 전에 EntityManagerFactory 인스턴스가 필요합니다 . 이것을 사용하여 EntityManager 를 만들 수 있습니다 . 이와 함께 트랜잭션 경계를 처리 하기 위해 TransactionManager 를 만들어야 합니다.

이를 사용하여 이전에 만든 엔터티를 유지하고 검색하는 방법을 살펴 보겠습니다.

private void persistTestData(EntityManagerFactory entityManagerFactory, Editor editor) throws Exception { TransactionManager transactionManager = com.arjuna.ats.jta.TransactionManager.transactionManager(); transactionManager.begin(); EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.persist(editor); entityManager.close(); transactionManager.commit(); }

여기에서는 EntityManager 를 사용하여 모든 관계에 계단식으로 연결된 루트 엔터티를 유지합니다. 또한 정의 된 트랜잭션 경계 내에서이 작업을 수행하고 있습니다.

이제 방금 유지 한 엔티티를로드하고 그 내용을 확인할 준비가되었습니다. 이를 확인하기 위해 테스트를 실행할 수 있습니다.

@Test public void givenMongoDB_WhenEntitiesCreated_thenCanBeRetrieved() throws Exception { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ogm-mongodb"); Editor editor = generateTestData(); persistTestData(entityManagerFactory, editor); TransactionManager transactionManager = com.arjuna.ats.jta.TransactionManager.transactionManager(); transactionManager.begin(); EntityManager entityManager = entityManagerFactory.createEntityManager(); Editor loadedEditor = entityManager.find(Editor.class, editor.getEditorId()); assertThat(loadedEditor).isNotNull(); // Other assertions to verify the entities and relations }

여기서는 EntityManager를 다시 사용하여 데이터를 찾고 이에 대한 표준 어설 션을 수행합니다. 이 테스트를 실행하면 데이터 저장소를 인스턴스화하고 항목을 유지하고 다시 검색하고 확인합니다.

다시 말하지만, JPA를 사용하여 엔티티와 관계를 유지합니다 . 마찬가지로 JPA를 사용하여 엔티티를 다시로드하면 데이터베이스 선택이 기존의 관계형 데이터베이스가 아닌 MongoDB 인 경우에도 모두 잘 작동합니다.

6. 백엔드 전환

백엔드를 전환 할 수도 있습니다. 이 작업을 수행하는 것이 얼마나 어려운지 이제 알아 보겠습니다.

백엔드를 인기있는 그래프 지향 데이터 저장소 인 Neo4j로 변경합니다.

먼저 Neo4j에 대한 Maven 종속성을 추가해 보겠습니다.

 org.hibernate.ogm hibernate-ogm-neo4j 5.4.0.Final 

다음으로, 우리는 우리의 관련 퍼시스턴스 유닛을 추가해야 persistence.xml을 :

 org.hibernate.ogm.jpa.HibernateOgmPersistence      

요컨대 Neo4j에 필요한 매우 기본적인 구성입니다. 필요에 따라 자세히 설명 할 수 있습니다.

글쎄, 그것은 거의해야 할 일입니다. 백엔드 데이터 저장소로 Neo4j로 동일한 테스트를 실행하면 매우 원활하게 작동합니다.

문서 지향 데이터 저장소 인 MongoDB에서 그래프 지향 데이터 저장소 인 Neo4j로 백엔드를 전환했습니다. 그리고 우리는이 모든 작업을 최소한의 변경으로 수행했으며 작업을 변경할 필요가 없었습니다 .

7. 결론

이 기사에서는 아키텍처를 포함하여 Hibernate OGM의 기본 사항을 살펴 보았습니다. 이후 기본 도메인 모델을 구현하고 다양한 DB를 활용하여 다양한 작업을 수행했습니다.

항상 그렇듯이 예제 코드는 GitHub에서 사용할 수 있습니다.