EntityManager, @PersistenceContext e @Transactional no Spring Data JPA
No Spring Data JPA, o EntityManager
, a anotação @PersistenceContext
e @Transactional
trabalham juntos para gerenciar operações de persistência de forma eficiente e segura. Vamos entender cada um desses componentes e como eles se relacionam.
1️⃣ EntityManager: O Que É e De Onde Vem?
O EntityManager
é a principal interface da Jakarta Persistence API (JPA) para gerenciar o ciclo de vida das entidades e interagir com o banco de dados. Ele permite operações como persistência, remoção e consultas.
📌 Origem do EntityManager
:
- O
EntityManager
vem da especificação JPA e é apenas uma interface. - Sua implementação concreta depende do provider JPA configurado no projeto (como Hibernate, EclipseLink ou OpenJPA).
- No Spring Boot, o Hibernate é o provider padrão.
📌 Trecho da Interface JPA (EntityManager
):
package jakarta.persistence; public interface EntityManager { void persist(Object entity); <T> T merge(T entity); void remove(Object entity); <T> T find(Class<T> entityClass, Object primaryKey); Query createQuery(String qlString); void close(); }
🔹 Como é apenas uma interface, o Hibernate fornece a implementação concreta.
1.1 Implementação do EntityManager
no Hibernate
Se o Hibernate for o provider JPA, a implementação real do EntityManager
será a classe org.hibernate.internal.SessionImpl
.
📌 Classe real do Hibernate (SessionImpl
):
package org.hibernate.internal; import jakarta.persistence.EntityManager; public class SessionImpl implements EntityManager { public void persist(Object entity) { // Implementação do persist no Hibernate } public <T> T merge(T entity) { // Implementação do merge no Hibernate } public void remove(Object entity) { // Implementação do remove no Hibernate } public void close() { // Implementação do close no Hibernate } }
🔹 O Hibernate usa
SessionImpl
para implementarEntityManager
.
1.2 Como o Spring Obtém a Implementação do EntityManager
?
O Spring Boot configura automaticamente um EntityManagerFactory
, que cria instâncias do EntityManager
.
📌 Fluxo de Criação do EntityManager
no Spring:
JPA (Jakarta Persistence API) ↓ EntityManager (Interface) ↓ Provider JPA (Ex: Hibernate) ↓ Hibernate Session (Implementação real) ↓ Spring Boot cria EntityManagerFactory automaticamente ↓ EntityManager injetado nos Beans com @PersistenceContext
🔹 O Spring gerencia automaticamente o ciclo de vida do
EntityManager
.
2️⃣ @PersistenceContext: Injetando o EntityManager no Spring
O Spring fornece automaticamente um EntityManager
gerenciado pelo container através da anotação @PersistenceContext
.
📌 Exemplo de Uso:
import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Repository; @Repository public class AutorRepositoryCustom { @PersistenceContext private EntityManager entityManager; public void salvar(Autor autor) { entityManager.persist(autor); } }
🔹 O Spring injeta o
EntityManager
automaticamente, e ele será gerenciado dentro do contexto da transação.
3️⃣ @Transactional: Garantindo a Consistência das Operações
A anotação @Transactional
gerencia as transações automaticamente. No Spring Data JPA, ela garante que as operações sejam executadas dentro de uma única transação.
3.1 Como Funciona o @Transactional
?
Quando um método anotado com @Transactional
é chamado:
- O Spring abre uma transação no banco de dados.
- O
EntityManager
é associado à transação e pode executar operações. - No final do método:
- Se não houver erro, o Spring faz o commit da transação.
- Se ocorrer uma exceção, o Spring faz rollback automaticamente.
📌 Exemplo de Uso do @Transactional
:
import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class AutorService { @PersistenceContext private EntityManager entityManager; @Transactional public void criarAutor(Autor autor) { entityManager.persist(autor); } }
🔹 O Spring abre uma transação quando
criarAutor
é chamado e fecha no final.
3.2 Configurações Avançadas do @Transactional
A anotação @Transactional
tem várias opções para personalizar o comportamento da transação:
Atributo | Descrição |
---|---|
readOnly = true | Otimiza consultas, garantindo que o método não fará alterações. |
propagation | Define como a transação se comporta caso outra já exista. |
isolation | Define o nível de isolamento (controle de concorrência). |
rollbackFor | Especifica quais exceções devem causar rollback. |
noRollbackFor | Define exceções que não devem causar rollback. |
📌 Exemplo de Uso Avançado:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class) public void processarTransacao() { // Operação no banco de dados }
🔹 O método sempre rodará dentro de uma transação e fará rollback em qualquer exceção.
4️⃣ Exemplo Completo: Repositório, Service e Transações
📌 Criando um Repositório Customizado com EntityManager
import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Repository; @Repository public class AutorRepositoryCustom { @PersistenceContext private EntityManager entityManager; public Autor buscarPorId(Long id) { return entityManager.find(Autor.class, id); } public void salvar(Autor autor) { entityManager.persist(autor); } }
📌 Criando um Serviço com @Transactional
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class AutorService { private final AutorRepositoryCustom autorRepository; public AutorService(AutorRepositoryCustom autorRepository) { this.autorRepository = autorRepository; } @Transactional public void registrarAutor(Autor autor) { autorRepository.salvar(autor); } }
🔹 A transação começa quando o método
registrarAutor
é chamado e fecha no final.
Conclusão
✔ EntityManager
vem da JPA e é gerenciado pelo EntityManagerFactory no Spring Boot.
✔ @PersistenceContext
injeta o EntityManager
automaticamente.
✔ @Transactional
garante que operações aconteçam dentro de uma transação.
✔ No Spring Boot, essas configurações são automáticas, mas podem ser personalizadas.
🚀 Agora você entende como EntityManager
, @PersistenceContext
e @Transactional
funcionam no Spring Data JPA! 🎯
Top comments (0)