Руководство по Hibernate EntityManager
1. Вступление
EntityManager является частью Java Persistence API. В основном он реализует программные интерфейсы и правила жизненного цикла, определенные спецификацией JPA 2.0.
Более того, мы можем получить доступ к контексту постоянства, используя API вEntityManager.
В этом руководстве мы рассмотрим конфигурацию, типы и различные APIEntityManager.
2. Maven Зависимости
Во-первых, нам нужно включить зависимости Hibernate:
org.hibernate
hibernate-core
5.4.0.Final
Нам также необходимо будет включить зависимости драйверов в зависимости от используемой базы данных:
mysql
mysql-connector-java
8.0.13
Зависимостиhibernate-core иmysql-connector-java доступны в Maven Central.
3. конфигурация
Теперь давайте продемонстрируемEntityManager, используя объектMovie, который соответствует таблице MOVIE в базе данных.
В этой статье мы будем использовать APIEntityManager для работы с объектамиMovie в базе данных.
3.1. Определение сущности
Давайте начнем с создания объекта, соответствующего таблице MOVIE, используя аннотацию@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. Файлpersistence.xml
КогдаEntityManagerFactory создан,the persistence implementation searches for the META-INF/persistence.xml file in the classpath.
Этот файл содержит конфигурацию дляEntityManager:
Hibernate EntityManager Demo
com.example.hibernate.pojo.Movie
true
Чтобы объяснить, мы определяем единицу постоянства, которая определяет базовое хранилище данных, управляемоеEntityManager.
Кроме того, мы определяем диалект и другие свойства JDBC базового хранилища данных. Hibernate не зависит от базы данных. Based on these properties, Hibernate connects with the underlying database.с
4. Контейнер и приложение, управляемыеEntityManager
В основномthere are two types of EntityManager – Container Managed and Application Managed.
Давайте подробнее рассмотрим каждый тип.
4.1. Контейнер под управлениемEntityManager
Здесь контейнер вводитEntityManager в наши корпоративные компоненты.
Другими словами, контейнер создает для насEntityManager изEntityManagerFactory:
@PersistenceContext
EntityManager entityManager;
Это также означаетthe container is in charge of beginning, committing, or rolling back the transaction.
4.2. Управляемое приложениемEntityManager
И наоборот, здесь жизненным цикломEntityManager управляет приложение.
Фактически, мы создадим вручнуюEntityManager.. Кроме того, мы также будем управлять жизненным циклом созданных намиEntityManager.
Во-первых, давайте создадимEntityManagerFactory:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.example.movie_catalog");
Чтобы создатьEntityManager, мы должны явно вызватьcreateEntityManager() вEntityManagerFactory:
public static EntityManager getEntityManager() {
return emf.createEntityManager();
}
5. Hibernate Entity Operations
APIEntityManager предоставляет набор методов. Мы можем взаимодействовать с базой данных, используя эти методы.
5.1. Постоянные сущности
Чтобы иметь объект, связанный с EntityManager, мы можем использовать методpersist():
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();
}
После сохранения объекта в базе данных он находится в состоянииpersistent.
5.2. Загрузка объектов
Для получения объекта из базы данных мы можем использовать методfind().
Здесь метод выполняет поиск по первичному ключу. Фактически, метод ожидает тип класса сущности и первичный ключ:
public Movie getMovie(Long movieId) {
EntityManager em = getEntityManager();
Movie movie = em.find(Movie.class, new Long(movieId));
em.detach(movie);
return movie;
}
However, if we just need the reference to the entity, we can use the getReference() вместо этого. По сути, он возвращает прокси для сущности:
Movie movieRef = em.getReference(Movie.class, new Long(movieId));
5.3. Отделение сущностей
В случае, если нам нужно отсоединить объект от контекста постоянства,we can use the detach() method. Мы передаем объект, который будет отсоединен, в качестве параметра методу:
em.detach(movie);
Как только объект отсоединен от контекста постоянства, он будет в отключенном состоянии.
5.4. Слияние сущностей
На практике многие приложения требуют модификации сущности для нескольких транзакций. Например, мы можем захотеть получить сущность в одной транзакции для рендеринга в пользовательский интерфейс. Затем другая транзакция внесет изменения, сделанные в пользовательском интерфейсе.
В таких ситуациях мы можем использовать методmerge(). 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. Запросы для сущностей
Кроме того, мы можем использовать JPQL для запроса сущностей. Мы вызовемgetResultList() для их выполнения.
Конечно, мы можем использоватьgetSingleResult(),, если запрос возвращает только один объект:
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. Удаление сущностей
Дополнительноwe can remove an entity from the database using the remove() method. Важно отметить, что объект не отсоединяется, а удаляется.
Здесь состояние объекта меняется с постоянного на новое:
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. Заключение
В этой статье мы исследовалиEntityManager вHibernate. Мы рассмотрели типы и конфигурацию, а также узнали о различных методах, доступных в API для работы сpersistence context.
Как всегда, в статье доступен кодover at Github.