Gymterview
middle

Архитектура Hibernate: SessionFactory, Session, Transaction

Архитектура Hibernate строится вокруг трёх ключевых компонентов: SessionFactory, Session и Transaction.

Аналогия из жизни: SessionFactory — это завод, который создаёт рабочие станции (Session). Каждая станция обслуживает одного клиента (транзакцию) и после завершения работы закрывается. Завод стоит дорого — его строят один раз, а станции создают по мере необходимости.

Компоненты

SessionFactory:

  • Тяжёлый, потокобезопасный объект, создаётся один раз при запуске приложения
  • Содержит маппинг-метаданные, конфигурацию, пул соединений
  • Создание SessionFactory — дорогая операция (парсинг аннотаций, валидация маппинга)
  • В JPA-терминах — EntityManagerFactory

Session:

  • Лёгкий, не потокобезопасный объект, создаётся для каждой единицы работы
  • Представляет собой Persistence Context — кэш первого уровня
  • Отслеживает состояние загруженных сущностей (Dirty Checking)
  • В JPA-терминах — EntityManager

Transaction:

  • Атомарная единица работы с БД
  • Все операции с БД должны выполняться в рамках транзакции
Пример: программное управление и Spring
// Программное управление (без Spring)
SessionFactory sessionFactory = new Configuration()
    .configure()
    .buildSessionFactory();

try (Session session = sessionFactory.openSession()) {
    Transaction tx = session.beginTransaction();
    try {
        User user = new User("John", "john@example.com");
        session.persist(user);

        User found = session.find(User.class, 1L);
        found.setName("Jane");
        // UPDATE сгенерируется автоматически при commit (Dirty Checking)

        tx.commit();
    } catch (Exception e) {
        tx.rollback();
        throw e;
    }
}

// С Spring — всё управляется автоматически через @Transactional
@Service
public class UserService {
    @Autowired
    private EntityManager entityManager;

    @Transactional
    public void createUser(String name, String email) {
        User user = new User(name, email);
        entityManager.persist(user);
        // commit произойдёт автоматически при выходе из метода
    }
}

Взаимосвязь компонентов

Пример
Application
    └── SessionFactory (1 на приложение, потокобезопасный)
            └── Session (1 на запрос/транзакцию, НЕ потокобезопасный)
                    ├── Persistence Context (L1 Cache)
                    ├── Transaction
                    └── JDBC Connection (из пула)

Важное

  • SessionFactory — один на приложение, создаётся при старте; Session — один на единицу работы
  • Session = Persistence Context = кэш первого уровня
  • Session не потокобезопасна — никогда не делите её между потоками
  • В Spring Session привязана к @Transactional — открывается при входе, закрывается при выходе

Частые ошибки

  • Создавать SessionFactory повторно — это крайне дорогая операция; один раз при запуске
  • Использовать Session из разных потоков — приводит к непредсказуемому поведению и data corruption
  • Работать без транзакции — чтение без транзакции допустимо, но запись без транзакции приведёт к ошибке или потере данных
  • Длинные транзакции — держать Session открытой долго (например, на время HTTP-запроса + рендеринга) — anti-pattern Open Session in View

Как используется в 2026

  • Spring Boot полностью управляет жизненным циклом SessionFactory и Session
  • EntityManager (JPA) предпочтительнее Session (Hibernate) в коде — стандартный API
  • HikariCP — стандартный пул соединений, интегрированный с Hibernate через Spring Boot
  • Open Session in View по умолчанию включён в Spring Boot, но рекомендуется отключать (spring.jpa.open-in-view=false)

На собеседовании: интервьюер часто спрашивает «что такое Session и чем она отличается от SessionFactory». Ключевые моменты: SessionFactory — один, потокобезопасный, дорогой в создании; Session — много, не потокобезопасная, привязана к транзакции. Обязательно упомяните, что Session = Persistence Context = L1 Cache.