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
EntityManagervem 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
SessionImplpara 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
EntityManagerautomaticamente, 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)