Що таке EntityManager і чим він відрізняється від Session
EntityManager та Session — два інтерфейси для роботи з ORM в Java. EntityManager — це стандартний JPA інтерфейс, а Session — Hibernate-специфічна реалізація. Розуміння відміннос...
Огляд
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]]