Питання 16 · Розділ 16

Що таке EntityManager і чим він відрізняється від Session

EntityManager та Session — два інтерфейси для роботи з ORM в Java. EntityManager — це стандартний JPA інтерфейс, а Session — Hibernate-специфічна реалізація. Розуміння відміннос...

Мовні версії: English Russian Ukrainian

Огляд

EntityManager та Session — два інтерфейси для роботи з ORM в Java. EntityManager — це стандартний JPA інтерфейс, а Session — Hibernate-специфічна реалізація. Розуміння відмінностей допомагає правильно обирати абстракцію.


🟢 Junior Level

Що таке EntityManager

EntityManager — це JPA стандартний інтерфейс для роботи з сутностями. Він визначений в специфікації JPA і працює з будь-яким JPA провайдером (Hibernate, EclipseLink, OpenJPA).

Примітка: в Hibernate 5 / Java EE використовується пакет javax.persistence, в Hibernate 6 / Jakarta EE — jakarta.persistence.

@PersistenceContext
private EntityManager em;

em.persist(user);
em.merge(user);
em.remove(user);
User found = em.find(User.class, 1L);

Що таке Session

Session — це Hibernate-специфічний інтерфейс. Він надає додаткові можливості, які не доступні в стандартному JPA.

Session session = entityManager.unwrap(Session.class);
session.save(user);
session.update(user);
session.delete(user);

Основна відмінність

  EntityManager Session
Стандарт JPA (jakarta.persistence) Hibernate (org.hibernate)
Переносимість Будь-який JPA провайдер Тільки Hibernate
Методи persist, merge, remove, find save, update, delete, get
Дод. можливості Ні doWork(), replicate(), ін.

🟡 Middle Level

Порівняння методів

EntityManager (JPA)          Session (Hibernate)
─────────────────           ─────────────────
persist()                   save()
merge()                     update(), saveOrUpdate()
remove()                    delete()
find()                      get()
detach()                    evict()

Коли використовувати EntityManager

// Для переносимості між JPA провайдерами
@Repository
public class UserRepository {
    @PersistenceContext
    private EntityManager em;

    public void save(User user) {
        em.persist(user);  // стандартний метод
    }
}

Коли використовувати Session

// Для Hibernate-специфічних можливостей
Session session = entityManager.unwrap(Session.class);

// Пряма робота з Connection
session.doWork(connection -> {
    // JDBC операції
});

// Native Hibernate можливості
session.byMultipleIds(User.class)
    .multiLoad(ids);

🔴 Senior Level

Внутрішня реалізація

// В Hibernate 5.2+ Session і EntityManager використовують спільну внутрішню
// реалізацію. Session implements EntityManager, а не обгортає його.

Коли варто використовувати Session

// 1. Native SQL з поверненням результату
// 2. Multi-load (Hibernate 5.1+)
// 3. Scrollable results (для великих даних)
// 4. Statistics

Коли НЕ варто використовувати Session

❌ Якщо не потрібні Hibernate-специфічні фічі
❌ Якщо можлива зміна провайдера
❌ Для стандартних CRUD операцій
❌ В бібліотеках/фреймворках (порушує абстракцію)

Best Practices

✅ EntityManager за замовчуванням
✅ unwrap(Session) коли потрібні Hibernate-фічі
✅ Стандартні методи для переносимості
✅ Session для batch/native operations

❌ Session якщо не потрібні Hibernate-фічі
❌ Змішування без причини
❌ Прямое використання Session в бібліотеках

🎯 Шпаргалка для співбесіди

Обов’язково знати:

  • EntityManager — JPA стандарт, працює з будь-яким провайдером
  • Session — Hibernate-специфічний інтерфейс, додаткові можливості
  • Session можна отримати через entityManager.unwrap(Session.class)
  • EntityManager за замовчуванням, Session коли потрібні Hibernate-фічі

Пов’язані теми:

  • [[7. Опишіть життєвий цикл Entity в Hibernate]]
  • [[14. У чому різниця між persist() і merge()]]
  • [[12. Що таке dirty checking в Hibernate]]
  • [[17. Як реалізувати оптимістичне блокування в JPA]]