← Назад к вопросам
В чем разница между EntityManager и SessionFactory?
2.0 Middle🔥 131 комментариев
#ORM и Hibernate
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
В чем разница между EntityManager и SessionFactory?
EntityManager и SessionFactory — это два ключевых компонента для работы с базой данных в Java, но они относятся к разным стандартам и имеют разные области ответственности.
Основные различия
EntityManager:
- Часть стандарта JPA (Java Persistence API)
- Интерфейс для управления персистентностью сущностей
- Работает с одной транзакцией/сессией
- Более высокоуровневый абстрактный слой
- Стандартизированный API для разных провайдеров ORM
SessionFactory:
- Часть Hibernate (конкретная реализация ORM)
- Фабрика для создания сессий
- Создаёт объекты Session — низкоуровневый интерфейс
- Специфичен для Hibernate
- Тяжёлый объект, обычно создаётся один раз при старте приложения
Пример: SessionFactory (Hibernate)
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
try {
User user = new User("John", "john@example.com");
session.save(user);
User retrieved = session.get(User.class, 1L);
tx.commit();
} finally {
session.close();
}
sessionFactory.close();
Пример: EntityManager (JPA/Hibernate)
@Service
public class UserService {
@PersistenceContext
private EntityManager entityManager;
public void saveUser(User user) {
entityManager.persist(user);
}
public User getUser(Long id) {
return entityManager.find(User.class, id);
}
public void updateUser(User user) {
entityManager.merge(user);
}
public void deleteUser(Long id) {
User user = entityManager.find(User.class, id);
entityManager.remove(user);
}
}
Сравнительная таблица
| Аспект | SessionFactory | EntityManager |
|---|---|---|
| Стандарт | Hibernate | JPA |
| Уровень | Низкоуровневый | Высокоуровневый |
| Создание | Один раз при старте | Per-transaction |
| Область действия | Application-wide | Per-request |
| Методы основные | openSession(), close() | persist(), merge(), find(), remove() |
| Портативность | Только Hibernate | Любой JPA провайдер |
Session операции
Session session = sessionFactory.openSession();
session.save(entity); // INSERT
session.update(entity); // UPDATE
session.delete(entity); // DELETE
session.get(Entity.class, id); // SELECT
Query query = session.createQuery("FROM User WHERE email = :email");
query.setParameter("email", "john@example.com");
User user = (User) query.uniqueResult();
EntityManager операции
entityManager.persist(user); // INSERT
entityManager.merge(user); // UPDATE
entityManager.remove(user); // DELETE
entityManager.find(User.class, id); // SELECT
TypedQuery<User> query = entityManager.createQuery(
"SELECT u FROM User u WHERE u.email = :email",
User.class
);
query.setParameter("email", "john@example.com");
User user = query.getSingleResult();
Spring конфигурация
// Hibernate подход
@Configuration
public class HibernateConfig {
@Bean
public PlatformTransactionManager transactionManager(SessionFactory sessionFactory) {
return new HibernateTransactionManager(sessionFactory);
}
}
// JPA подход
@Configuration
public class JpaConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.example.entity");
return em;
}
}
Когда использовать что
Используй SessionFactory когда:
- Работаешь напрямую с Hibernate
- Нужен низкоуровневый контроль
- Работаешь с legacy-кодом
Используй EntityManager когда:
- Работаешь в Spring приложении
- Хочешь переносимый код (JPA стандарт)
- Используешь @Transactional
- Работаешь с JpaRepository
В современных Spring приложениях используй EntityManager через @PersistenceContext или JpaRepository. SessionFactory — это низкоуровневый интерфейс Hibernate, который необходим при работе вне Spring-контекста.