Gymterview
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 нужен редко.