← Назад к вопросам

В чем разница между 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);
    }
}

Сравнительная таблица

АспектSessionFactoryEntityManager
СтандартHibernateJPA
УровеньНизкоуровневыйВысокоуровневый
СозданиеОдин раз при стартеPer-transaction
Область действияApplication-widePer-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-контекста.

В чем разница между EntityManager и SessionFactory? | PrepBro