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

Ответ

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.

Ответ 18+ 🔞

А, слушай, смотри, вот эта штука — SessionFactory — это типа главный штаб, блядь, в Hibernate. Представь себе здоровенный, неповоротливый ящик, который один раз на старте приложения грузят, а потом он стоит и пыхтит. И он потокобезопасный, то есть с ним можно со всех потоков одновременно работать, не боясь, что он сломается.

Зачем он вообще нужен, этот здоровяк?

  1. Фабрика сессий, ёпта. Его основная работа — штамповать лёгкие объекты Session. Это как раз те самые рабочие лошадки, которые с базой общаются.
    Session session = sessionFactory.openSession(); // Дай-ка мне одну сессию, работничка!
  2. Хранитель всех секретов. Он в своей памяти держит овердохуище метаданных: как твои классы связаны с таблицами, какие SQL-запросы готовить, про кеши всякие, если они есть. Одним словом, всю конфигурацию ORM он в себя впитал, как губка.
  3. Знает, как подключиться. В нём сидит вся инфа о пуле соединений, о диалекте базы данных (чтобы не говорить с PostgreSQL на языке MySQL, понимаешь?). Всё это он вычитал из hibernate.cfg.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 — это долго и дорого. Поэтому делаем это ОДИН РАЗ на всё приложение. Представь, что ты каждый раз перед запросом в базу заново собираешь шкаф из IKEA — терпения ебать ноль.
  • В Spring-приложениях про это вообще можно не париться — там его как бин создадут и в нужное место вставят.
  • А вот Session — это лёгкая, НЕ потокобезопасная штука. Каждый поток должен тащить свою собственную сессию, а не делиться одной на всех, иначе будет пиздец и race conditions.