Java-программист в Project_Stsrt
· 11.12В 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-программист в Project_Stsrt
· 11.12войдите, чтобы увидеть
и подписаться на интересных профи