개요
In this guide, you can learn how to use the MongoDB Extension for Hibernate ORM to perform transactions. Transactions allow you to run a series of operations that change data only if the entire transaction is committed.
MongoDB 에서 트랜잭션은 논리적 세션 내에서 실행 . 세션은 순차적으로 실행 하려는 관련 읽기 또는 쓰기 (write) 작업을 그룹화한 것입니다. 세션을 사용하면 작업 그룹 에 인과적 일관성 활성화 원자성, 일관성, 격리 및 내구성에 대한 기대치를 충족하는 트랜잭션 인 ACID 호환 트랜잭션 에서 작업을 실행 수 있습니다.
하이버네이트 ORM 확장은 세션 및 트랜잭션 관리를 위해 다음 API를 지원합니다.
Hibernate
Session: Allows you to use theorg.hibernate.TransactionAPI to group your database operations. To learn more, see Hibernate Transaction API in the Hibernate ORM user guide.자카르타
EntityManager지속성: 하이버네이트 ORM이 내부적으로 를 관리Session하도록 지시하고jakarta.persistence.EntityTransactionAPI 사용하여 데이터베이스 작업을 그룹 있도록 합니다. 자세한 학습 자카르타 EE 문서에서 ja카르타.퍼시스턴스 패키지 참조하세요.
샘플 데이터
이 가이드 의 예제에서는 Movie Atlas sample_mflix.movies 샘플 데이터 세트의 컬렉션 나타내는 엔터티를 사용합니다.Movie 엔터티의 정의는 다음과 같습니다.
import com.mongodb.hibernate.annotations.ObjectIdGenerator; import org.bson.types.ObjectId; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; public class Movie { private ObjectId id; private String title; private String plot; private int year; private String[] cast; public Movie(String title, String plot, int year, String[] cast) { this.title = title; this.plot = plot; this.year = year; this.cast = cast; } public Movie() { } public ObjectId getId() { return id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPlot() { return plot; } public void setPlot(String plot) { this.plot = plot; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public String[] getCast() { return cast; } public void setCast(String[] cast) { this.cast = cast; } }
최대 절전 모드용 MongoDB 확장 ORM을 사용하여 이 MongoDB 샘플 컬렉션 과 상호 작용 Java 애플리케이션 을 만드는 방법을 학습 시작하기 튜토리얼을 참조하세요.
세션 만들기
MongoDB 데이터와 상호 작용 하려면 세션에서 모든 데이터베이스 작업을 실행 해야 합니다. 이 섹션에서는 다음과 같은 방법으로 데이터베이스 세션을 관리 방법을 보여줍니다.
최대 절전 모드 세션 사용: 최대 절전 모드의 네이티브 API 사용하여 에서 를 생성합니다.
SessionSessionFactoryJPA EntityManager 사용: 자카르타 지속성 API 사용하여 에서 를 만듭니다.
EntityManagerEntityManagerFactory
최대 절전 모드 세션 사용
팁
를 Session HibernateUtil.java 사용하기 전에 를 구성하는 파일 만들어야 SessionFactory 합니다. 자세히 학습 시작하기 튜토리얼의 애플리케이션 구성 단계를 참조하세요.
최대 절전 모드 Session를 시작하려면 다음 단계를 수행하세요.
getSessionFactory()메서드를 사용하여HibernateUtil유틸리티 클래스에서SessionFactory를 검색합니다.SessionFactory는 MongoDB 연결 구성을 저장하고 새 데이터베이스 세션을 열 수 있습니다.SessionFactory인스턴스 에서openSession()메서드를 호출하여Session를 만듭니다.데이터베이스 작업을 실행 후 두 인스턴스 모두에서
close()메서드를 사용하여SessionFactory및Session를 닫습니다.
다음 예시 세션에서 데이터베이스 쿼리 실행하고 sample_mflix.movies 컬렉션 에서 title 값이 "Erin Brockovich" 인 문서 조회합니다.
var sf = HibernateUtil.getSessionFactory(); Session session = sf.openSession(); var movie = session.createQuery("from Movie where title = :t", Movie.class) .setParameter("t", "Erin Brockovich") .getSingleResult(); System.out.println("Title: " + movie.getTitle() + ", Year: " + movie.getYear()); session.close(); sf.close();
Title: Erin Brockovich, Year: 2000
다음 코드와 같이 Java의 try-with-resources 성명서 사용하여 세션 관리 로직을 간소화하고 세션을 자동으로 닫을 수도 있습니다.
var sf = HibernateUtil.getSessionFactory(); try (Session session = sf.openSession()) { var movie = session.createQuery("from Movie where title = :t", Movie.class) .setParameter("t", "Erin Brockovich") .getSingleResult(); System.out.println("Title: " + movie.getTitle() + ", Year: " + movie.getYear()); } sf.close();
JPA EntityManager 사용
팁
를 EntityManager 사용하기 전에 persistence.xml 지속성 단위를 선언하는 파일 만들어야 합니다. 자세히 학습 하이버네이트 ORM 문서에서 JPA 표준 API를 사용하는 튜토리얼을 참조하세요.
자카르타 지속성 API (JPA) EntityManager을(를) 시작하려면 다음 단계를 수행하세요.
내부적으로
SessionFactory를 생성하는createEntityManagerFactory()메서드를 호출하여persistence.xml파일 에서EntityManagerFactory를 생성합니다.EntityManagerFactory인스턴스 에서createEntityManager()메서드를 호출하여EntityManager를 생성하고, 내부적으로Session를 생성합니다.데이터베이스 작업을 실행 후 두 인스턴스 모두에서
close()메서드를 호출하여EntityManagerFactory및EntityManager를 닫습니다.
다음 예시 엔터티 관리자에서 데이터베이스 쿼리 실행하고 sample_mflix.movies 컬렉션 에서 year 값이 1929 인 문서를 검색합니다.
// Replace <persistence unit> with the name of your persistence unit in the persistence.xml file EntityManagerFactory emf = Persistence.createEntityManagerFactory("<persistence unit>"); EntityManager entityManager = emf.createEntityManager(); var results = entityManager.createQuery("select m from Movie m where m.year = :y", Movie.class) .setParameter("y", 1929) .getResultList(); results.forEach(movie -> System.out.println(movie.getTitle())); entityManager.close(); emf.close();
The Broadway Melody Queen Kelly Asphalt Hallelujah Disraeli Applause Lambchops
자카르타 지속성 v3.1 이상에서는 최대 절전 EntityManager 모드 세션 섹션에 표시된 대로 Java의 try-with-resources 성명서 사용하여 를 자동으로 닫을 수 있습니다.
트랜잭션 실행
MongoDB 데이터를 수정하려면 트랜잭션 에서 모든 쓰기 (write) 작업을 실행 해야 합니다. 이 섹션에서는 다음과 같은 방법으로 트랜잭션 관리 방법을 보여줍니다.
최대 절전 모드 트랜잭션 사용: 최대 절전 모드의 네이티브
org.hibernate.TransactionAPI 사용하여 에서 트랜잭션 시작합니다.SessionJPA EntityTransaction 사용:
jakarta.persistence.EntityTransactionAPI 사용하여 에서 트랜잭션 시작합니다.EntityManager
최대 절전 모드 트랜잭션 사용
최대 절전 모드 Transaction를 시작하려면 Session 인스턴스 에서 beginTransaction() 메서드를 호출합니다. 작업을 실행 하고 persist() 메서드를 사용하여 세션에 변경 사항을 등록한 후 commit() 메서드를 호출하여 트랜잭션 커밋 .
다음 예시 트랜잭션 사용하여 새 Movie 엔티티를 생성하고 이를 sample_mflix.movies 컬렉션 에 문서 로 삽입합니다. 강조 표시된 줄이 트랜잭션 시작하고 커밋 .
var sf = HibernateUtil.getSessionFactory(); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); var newMovie = new Movie(); newMovie.setTitle("Lady Bird"); session.persist(newMovie); tx.commit(); session.close(); sf.close();
JPA EntityTransaction 사용
JPA EntityTransaction를 만들려면 EntityManager에서 getTransaction() 메서드를 호출합니다. 이 메서드는 기본 하이버네이트 Transaction를 래핑하는 EntityTransaction를 검색합니다. 그런 다음 begin() 메서드를 호출하여 트랜잭션 시작합니다. 작업을 실행 하고 persist() 메서드를 사용하여 엔터티 관리자에 변경 사항을 등록한 후 commit() 메서드를 호출하여 트랜잭션 커밋 .
다음 예시 EntityTransaction 를 사용하여 sample_mflix.movies 컬렉션 에서 문서 삭제 . 강조 표시된 줄이 트랜잭션 시작하고 커밋 .
// Replace <persistence unit> with the name of your persistence unit in the persistence.xml file EntityManagerFactory emf = Persistence.createEntityManagerFactory("<persistence unit>"); EntityManager entityManager = emf.createEntityManager(); entityManager.getTransaction().begin(); // Your ObjectId value might differ Movie movieToDelete = entityManager.find(Movie.class, new ObjectId("573a1399f29313caabcedc5d")); entityManager.remove(movieToDelete); entityManager.getTransaction().commit(); entityManager.close(); emf.close();
트랜잭션 오류 처리
트랜잭션 에서 모든 데이터 변경 사항을 삭제하려면 하이버네이트 Transaction 또는 JPA EntityTransaction에서 rollback() 메서드를 호출합니다. 이 메서드를 호출한 후 최대 절전 모드 ORM은 커밋되지 않은 변경 사항을 되돌리고 지속성 컨텍스트를 지웁니다.
다음 예시 코드에서 오류가 발생하는 경우 트랜잭션 롤백합니다. Hibernate Transaction 또는 JPA EntityTransaction 탭 선택하여 해당 코드를 확인합니다.
Session session = sessionFactory.openSession(); Transaction tx = null; try { tx = session.beginTransaction(); Movie movie = new Movie(); movie.setTitle("Control Alt Delete"); session.persist(movie); tx.commit(); } catch (Exception e) { if (tx != null) { tx.rollback(); } e.printStackTrace(); } finally { session.close(); }
EntityManager entityManager = emf.createEntityManager(); EntityTransaction tx = entityManager.getTransaction(); try { tx.begin(); Movie movie = new Movie(); movie.setTitle("Control Alt Delete"); entityManager.persist(movie); tx.commit(); } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); } e.printStackTrace(); } finally { entityManager.close(); }
추가 정보
세션 및 엔티티 관리자에 대해 자세히 학습 하이버네이트 ORM 문서에서 지속성 컨텍스트를 참조하세요.