В Java Persistence API (JPA), EntityManager — это основной интерфейс, который предоставляет API для взаимодействия с персистентным контекстом (Persistence Context). Он используется для управления жизненным циклом сущностей, выполнения операций с базой данных и управления транзакциями. Давайте разберемся, как он работает и как используется.

Что такое EntityManager?

1. Persistence Context: EntityManager управляет контекстом персистентности, который является временным кэшем для объектов (сущностей). Контекст персистентности обеспечивает привязку объектов Java к их состоянию в базе данных. Если объект находится в персистентном контексте, он связан с базой данных. Любые изменения объекта автоматически будут синхронизированы с базой данны Если объект не находится в контексте (например, после вызова detach), изменения объекта не будут отражены в базе.

2. Жизненный цикл сущности:

Объекты могут находиться в различных состояниях: Transient (временное): Объект создан, но не связан с EntityManager и не сохранен в базе данных. Managed (управляемое): Объект привязан к контексту персистентности, и изменения в объекте автоматически синхронизируются с базой. Detached (отсоединенное): Объект больше не привязан к контексту. Removed (удаленное): Объект будет удален из базы данных.

Основные методы EntityManager.

1. Создание и сохранение сущностей:

EntityManager em = entityManagerFactory.createEntityManager(); em.getTransaction().begin(); MyEntity entity = new MyEntity(); entity.setName("Example"); em.persist(entity); // Сохраняет объект в базе данных em.getTransaction().commit();

2. Поиск сущностей:

MyEntity foundEntity = em.find(MyEntity.class, 1L); // Поиск по ID

3. Обновление данных:

Если объект находится в состоянии "managed", любые изменения будут синхронизированы:

MyEntity entity = em.find(MyEntity.class, 1L); entity.setName("Updated Name"); // Синхронизируется автоматически

Для объектов "detached" нужно использовать merge:

MyEntity detachedEntity = new MyEntity(); detachedEntity.setId(1L); detachedEntity.setName("Updated Name"); em.getTransaction().begin(); em.merge(detachedEntity); // Сливает изменения в персистентный контекст em.getTransaction().commit();

4. Удаление сущностей:

MyEntity entity = em.find(MyEntity.class, 1L); em.getTransaction().begin(); em.remove(entity); // Удаляет из базы данных em.getTransaction().commit();

5. Контроль контекста персистентности:

detach — исключает объект из контекста: em.detach(entity); clear — очищает весь контекст: em.clear(); contains — проверяет, находится ли объект в контексте: boolean isManaged = em.contains(entity);

6. Выполнение JPQL/SQL-запросов:

List<MyEntity> results = em.createQuery("SELECT e FROM MyEntity e WHERE e.name = :name", MyEntity.class)                            .setParameter("name", "Example")                            .getResultList();

Как работает EntityManager

Переходы между состояниями: EntityManager управляет состояниями сущностей:

При вызове persist объект переходит из transient в managed.

При вызове remove объект переходит в removed, а затем удаляется из базы данных.

Если вы вызываете merge, объект создается в managed состоянии или обновляется существующий.

Контекст персистентности: В контексте Hibernate каждый EntityManager ассоциирован с единичным контекстом персистентности, который существует в рамках одной транзакции. Этот контекст выступает как "кэш первого уровня". Объекты, найденные или сохраненные, хранятся в кэше, и повторный запрос на те же данные возвращает кэшированные экземпляры.

Преимущества использования EntityManager:

1. Управление состояниями сущностей: Автоматическое отслеживание изменений упрощает работу.

2. Транзакционность: Легкая интеграция с транзакциями через begin, commit, rollback.

3. Гибкость запросов: Поддержка JPQL и нативных SQL-запросов.

4. Оптимизация производительности: Кэширование сущностей снижает количество операций с базой данных.

В Java Persistence API (JPA), EntityManager — это основной интерфейс, который предоставляет API для взаимодействия с персистентным контекстом (Persistence Context) | Сетка — новая социальная сеть от hh.ru
repost

94

input message

напишите коммент

еще контент автора

еще контент автора

войдите, чтобы увидеть

и подписаться на интересных профи

в приложении больше возможностей

пока в веб-версии есть не всё — мы вовсю работаем над ней

сетка — cоциальная сеть для нетворкинга от hh.ru

пересекайтесь с теми, кто повлияет на ваш профессиональный путь