Что такое SessionFactory в Hibernate?

«Что такое SessionFactory в Hibernate?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SessionFactory — это тяжеловесный (heavyweight), потокобезопасный (thread-safe) объект в Hibernate, который инициализируется один раз за время жизни приложения и служит фабрикой для создания легковесных (lightweight) объектов Session.

Роль и ответственность:

  1. Фабрика сессий: Единственный источник для создания объектов Session, которые представляют собой единицу работы с БД.
    Session session = sessionFactory.openSession();
  2. Кеширование метаданных: Хранит в памяти всю конфигурацию ORM:
    • Маппинги сущностей (аннотации или XML).
    • SQL-строки для основных операций.
    • Информацию о второстепенном кеше (если настроен).
  3. Настройка соединения: Содержит информацию о пуле соединений (DataSource), диалекте БД и других свойствах из hibernate.cfg.xml или persistence.xml.

Жизненный цикл:

// 1. Создание (обычно при старте приложения)
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
        .configure("hibernate.cfg.xml").build();
SessionFactory sessionFactory = new MetadataSources(registry)
        .buildMetadata().buildSessionFactory();

// 2. Использование для получения сессий
Session session = sessionFactory.openSession();
// ... работа с БД через session
session.close(); // Закрытие сессии возвращает ее в пул

// 3. Закрытие (обычно при остановке приложения)
sessionFactory.close();

Важно:

  • Создание SessionFactory — ресурсоемкая операция, поэтому его следует создавать один раз.
  • В Spring приложениях SessionFactory обычно инжектируется как бин, управляемый контейнером.
  • Каждый поток должен работать со своей собственной Session.