Guia do EntityManager do Hibernate
1. Introdução
EntityManager faz parte da Java Persistence API. Principalmente, ele implementa as interfaces de programação e regras de ciclo de vida definidas pela especificação JPA 2.0.
Além disso, podemos acessar o Contexto de Persistência, usando as APIs emEntityManager.
Neste tutorial, daremos uma olhada na configuração, tipos e várias APIs deEntityManager.
2. Dependências do Maven
Primeiro, precisamos incluir as dependências do Hibernate:
org.hibernate
hibernate-core
5.4.0.Final
Também teremos que incluir as dependências do driver, dependendo do banco de dados que estamos usando:
mysql
mysql-connector-java
8.0.13
As dependênciashibernate-coreemysql-connector-java estão disponíveis no Maven Central.
3. Configuração
Agora, vamos demonstrar oEntityManager, usando uma entidadeMovie que corresponde a uma tabela MOVIE no banco de dados.
Ao longo deste artigo, usaremos a APIEntityManager para trabalhar com os objetosMovie no banco de dados.
3.1. Definindo a entidade
Vamos começar criando a entidade correspondente à tabela MOVIE, usando a anotação@Entity:
@Entity
@Table(name = "MOVIE")
public class Movie {
@Id
private Long id;
private String movieName;
private Integer releaseYear;
private String language;
// standard constructor, getters, setters
}
3.2. O arquivopersistence.xml
QuandoEntityManagerFactory é criado,the persistence implementation searches for the META-INF/persistence.xml file in the classpath.
Este arquivo contém a configuração deEntityManager:
Hibernate EntityManager Demo
com.example.hibernate.pojo.Movie
true
Para explicar, definimos a unidade de persistência que especifica o armazenamento de dados subjacente gerenciado porEntityManager.
Além disso, definimos o dialeto e as outras propriedades JDBC do armazenamento de dados subjacente. O Hibernate é independente de banco de dados. Based on these properties, Hibernate connects with the underlying database.
4. Contêiner e aplicativo gerenciadoEntityManager
Basicamente,there are two types of EntityManager – Container Managed and Application Managed.
Vamos dar uma olhada em cada tipo.
4.1. Contêiner gerenciadoEntityManager
Aqui, o contêiner injetaEntityManager em nossos componentes corporativos.
Em outras palavras, o contêiner criaEntityManager deEntityManagerFactory para nós:
@PersistenceContext
EntityManager entityManager;
Isso também significathe container is in charge of beginning, committing, or rolling back the transaction.
4.2. Aplicativo gerenciadoEntityManager
Por outro lado, o ciclo de vida deEntityManager é gerenciado pelo aplicativo aqui.
Na verdade, criaremos manualmente oEntityManager. Além disso, também gerenciaremos o ciclo de vida dosEntityManager que criamos.
Primeiro, vamos criar oEntityManagerFactory:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.example.movie_catalog");
Para criar umEntityManager, devemos chamar explicitamentecreateEntityManager() emEntityManagerFactory:
public static EntityManager getEntityManager() {
return emf.createEntityManager();
}
5. Operações de entidade do Hibernate
A APIEntityManager fornece uma coleção de métodos. Podemos interagir com o banco de dados, usando esses métodos.
5.1. Entidades Persistentes
Para ter um objeto associado ao EntityManager, podemos fazer uso do métodopersist():
public void saveMovie() {
EntityManager em = getEntityManager();
em.getTransaction().begin();
Movie movie = new Movie();
movie.setId(1L);
movie.setMovieName("The Godfather");
movie.setReleaseYear(1972);
movie.setLanguage("English");
em.persist(movie);
em.getTransaction().commit();
}
Depois que o objeto é salvo no banco de dados, ele fica no estadopersistent.
5.2. Carregando entidades
Para o propósito de recuperar um objeto do banco de dados, podemos usar o métodofind().
Aqui, o método procura por chave primária. De fato, o método espera o tipo de classe de entidade e a chave primária:
public Movie getMovie(Long movieId) {
EntityManager em = getEntityManager();
Movie movie = em.find(Movie.class, new Long(movieId));
em.detach(movie);
return movie;
}
métodoHowever, if we just need the reference to the entity, we can use the getReference() em vez disso. Com efeito, ele retorna um proxy para a entidade:
Movie movieRef = em.getReference(Movie.class, new Long(movieId));
5.3. Destacando Entidades
No caso de precisarmos desanexar uma entidade do contexto de persistência,we can use the detach() method. Passamos o objeto a ser desanexado como parâmetro para o método:
em.detach(movie);
Depois que a entidade for desanexada do contexto de persistência, ela estará no estado desanexado.
5.4. Entidades de fusão
Na prática, muitos aplicativos exigem modificação de entidade em várias transações. Por exemplo, podemos querer recuperar uma entidade em uma transação para renderizar para a interface do usuário. Em seguida, outra transação trará as alterações feitas na interface do usuário.
Podemos fazer uso do métodomerge(), para tais situações. The merge method helps to bring in the modifications made to the detached entity, in the managed entity, if any:
public void mergeMovie() {
EntityManager em = getEntityManager();
Movie movie = getMovie(1L);
em.detach(movie);
movie.setLanguage("Italian");
em.getTransaction().begin();
em.merge(movie);
em.getTransaction().commit();
}
5.5. Consultando entidades
Além disso, podemos usar o JPQL para consultar entidades. Vamos invocargetResultList() para executá-los.
Claro, podemos usargetSingleResult(), se a consulta retornar apenas um único objeto:
public List> queryForMovies() {
EntityManager em = getEntityManager();
List> movies = em.createQuery("SELECT movie from Movie movie where movie.language = ?1")
.setParameter(1, "English")
.getResultList();
return movies;
}
5.6. Removendo entidades
Além disso,we can remove an entity from the database using the remove() method. É importante observar que o objeto não é destacado, mas removido.
Aqui, o estado da entidade muda de persistente para novo:
public void removeMovie() {
EntityManager em = HibernateOperations.getEntityManager();
em.getTransaction().begin();
Movie movie = em.find(Movie.class, new Long(1L));
em.remove(movie);
em.getTransaction().commit();
}
6. Conclusão
Neste artigo, exploramosEntityManager emHibernate. Vimos os tipos e configurações e aprendemos sobre os vários métodos disponíveis na API para trabalhar com opersistence context.
Como sempre, o código usado no artigo está disponívelover at Github.