Menu Docs
Página inicial do Docs
/ /

Transações e Sessões

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.

No MongoDB, as transações são executadas dentro de sessões lógicas. Uma sessão é um agrupamento de operações de leitura ou escrita relacionadas que você deseja executar sequencialmente. As sessões permitem consistência causal para um grupo de operações e permitem executar operações em uma transação compatível com ACID, que é uma transação que atende a uma expectativa de atomicidade, consistência, isolamento e durabilidade.

A extensão Hibername ORM suporta as seguintes APIs para gerenciar sessões e transações:

  • Hibernate Session: Allows you to use the org.hibernate.Transaction API to group your database operations. To learn more, see Hibernate Transaction API in the Hibernate ORM user guide.

  • Jakarta Persistence:EntityManager Instrui o ORM do Hibername a gerenciar um Session internamente e permite que você utilize a jakarta.persistence.EntityTransaction API do para agrupar suas operações de banco de dados . Para saber mais, consulte o pacote jákarta.persistence na documentação do Jakarta EE.

Os exemplos neste guia usam a Movie entidade, que representa a sample_mflix.movies coleção dos conjuntos de dados de amostra do Atlas. A Movie entidade tem a seguinte definição:

import com.mongodb.hibernate.annotations.ObjectIdGenerator;
import org.bson.types.ObjectId;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "movies")
public class Movie {
@Id
@ObjectIdGenerator
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;
}
}

Para saber como criar um aplicação Java que usa a extensão MongoDB para hibernação ORM para interagir com essa coleção de amostras do MongoDB , consulte o tutorial de Introdução.

Para interagir com dados MongoDB , você deve executar todas as operações do banco de dados em uma sessão. Esta seção mostra como gerenciar uma sessão do banco de dados das seguintes maneiras:

Dica

Antes de utilizar Session um, você deve criar um HibernateUtil.java arquivo que configura SessionFactory um. Para saber mais, consulte a etapa Configurar seu aplicativo do tutorial de Introdução.

Para iniciar um Session de hibernação, execute as seguintes etapas:

  1. Recupere um SessionFactory da sua classe de utilidade HibernateUtil usando o método getSessionFactory(). O SessionFactory armazena sua configuração de conexão MongoDB e pode abrir novas sessões de banco de dados .

  2. Crie um Session chamando o método openSession() em sua instância do SessionFactory.

  3. Após executar as operações do banco de dados , feche o SessionFactory e o Session usando o método close() em ambas as instâncias.

O exemplo a seguir executa uma query de banco de dados em uma sessão e recupera um documento que tem um title valor "Erin Brockovich" da sample_mflix.movies collection:

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

Você também pode usar a instrução try-with-resources do Java para simplificar a lógica de gerenciamento da sessão e fechar automaticamente a sessão, conforme mostrado no código a seguir:

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();

Dica

Antes de utilizar EntityManager um, você deve criar um persistence.xml arquivo que declara uma unidade de persistência. Para saber mais, consulte o Tutorial usando APIs padrão JPA na documentação do ORM do Hibernado.

Para iniciar uma API de Persistência de Jacarta (JPA) EntityManager, execute as seguintes etapas:

  1. Crie um EntityManagerFactory a partir do seu arquivo persistence.xml chamando o método createEntityManagerFactory(), que cria um SessionFactory internamente.

  2. Crie um EntityManager chamando o método createEntityManager() em sua instância do EntityManagerFactory, que cria um Session internamente.

  3. Após executar as operações do banco de dados , feche seu EntityManagerFactory e EntityManager chamando o método close() em ambas as instâncias.

O exemplo a seguir executa uma query de banco de dados em um gerenciador de entidade e recupera documentos que têm um year valor 1929 da sample_mflix.movies collection:

// 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

No Jakarta Persistence v3.1 ou posterior, você pode usar a instrução try-with-resources do Java para fechar automaticamente EntityManager o, conforme mostrado na seção Sessão de hibernação.

Para modificar dados MongoDB , você deve executar todas as operações de gravação em uma transação. Esta seção mostra como gerenciar uma transação das seguintes maneiras:

  • Use uma transação Hibernar: Use a API nativa do Hibernado org.hibernate.Transaction para iniciar uma transação a partir de um Session

  • Use uma EntityTransaction JPA: use a jakarta.persistence.EntityTransaction API para iniciar uma transação a partir de um EntityManager

Para iniciar um Transaction de hibernação, chame o método beginTransaction() em uma instância Session. Depois de executar as operações e usar o método persist() para registrar suas alterações na sessão, confirme a transação chamando o método commit().

O exemplo a seguir usa uma transação para criar uma nova entidade Movie e inseri-la como um documento na coleção sample_mflix.movies. As linhas destacadas iniciam e confirmam a transação.

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();

Para criar um EntityTransaction JPA, chame o método getTransaction() no seu EntityManager. Este método recupera um EntityTransaction, que envolve o hibernação subjacente Transaction. Em seguida, chame o método begin() para iniciar a transação. Depois de executar as operações e usar o método persist() para registrar suas alterações com o gerenciador de entidades, confirme a transação chamando o método commit().

O exemplo a seguir usa um EntityTransaction para excluir um documento da collection sample_mflix.movies. As linhas destacadas iniciam e confirmam a transação.

// 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();

Para descartar todas as alterações de dados de uma transação, chame o método rollback() em um Hibernar Transaction ou um EntityTransaction JPA. Depois de chamar esse método, o ORM do Hibername reverte as alterações não confirmadas e limpa o contexto de persistência.

O exemplo a seguir reverte a transação se o código gerar um erro. Selecione a aba Hibernate Transaction ou JPA EntityTransaction para ver o código correspondente:

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();
}

Para saber mais sobre sessões e gerenciadores de entidade, consulte Contexto de persistência na documentação ORM do Hibernado.

Para saber mais sobre transações, consulte Transações na documentação do ORM do Hibernado.

Voltar

Executar queries nativas

Nesta página