middle
Что такое EntityManager и чем он отличается от Session?
EntityManager — JPA-интерфейс для управления персистентными сущностями. Session — Hibernate-интерфейс, расширяющий EntityManager дополнительными возможностями.
Пример
// EntityManager (JPA — стандартный)
@PersistenceContext
private EntityManager entityManager;
entityManager.persist(entity); // сохранить
entityManager.find(User.class, id); // найти
entityManager.merge(entity); // слить Detached
entityManager.remove(entity); // удалить
entityManager.createQuery("..."); // JPQL-запрос
// Session (Hibernate — расширенный)
Session session = entityManager.unwrap(Session.class);
session.byNaturalId(User.class).using("email", email).load(); // поиск по натуральному ключу
session.byMultipleIds(User.class).multiLoad(1L, 2L, 3L); // batch load
session.setDefaultReadOnly(true); // read-only для всей сессии
session.enableFilter("activeOnly"); // динамические фильтры
Основные различия
| Возможность | EntityManager (JPA) | Session (Hibernate) |
|---|---|---|
| persist() | Да | Да |
| find() | Да | Да |
| Natural ID | Нет | byNaturalId() |
| Multi-load | Нет | byMultipleIds() |
| Фильтры | Нет | enableFilter() |
| Read-only mode | Нет | setDefaultReadOnly() |
Важное
- EntityManager — стандартный JPA API, переносимый между реализациями
- Session — Hibernate-специфичный, с дополнительными возможностями
- В Spring приложении используйте EntityManager, переключаясь на Session через
unwrap()только при необходимости - Spring Data JPA полностью абстрагирует от EntityManager/Session
Частые ошибки
- Использовать Session без необходимости — теряется переносимость кода
- Создавать EntityManager вручную — в Spring используйте
@PersistenceContextили Spring Data - Путать
persist()иmerge()— persist для новых (transient), merge для detached; persist бросит исключение для detached
Как используется в 2026
- Spring Data JPA — основной API; прямой доступ к EntityManager — для кастомных запросов
- Session используется для Hibernate-специфичных оптимизаций (batch load, natural ID, filters)
На собеседовании: EntityManager — стандарт JPA, Session — расширение Hibernate. По умолчанию используйте EntityManager. Переход на Session через
unwrap()оправдан для конкретных задач: Natural ID, multi-load, фильтры. В Spring Data JPA прямой доступ к EntityManager/Session нужен редко.