Ответ
SessionFactory — это тяжеловесный (heavyweight), потокобезопасный (thread-safe) объект в Hibernate, который инициализируется один раз за время жизни приложения и служит фабрикой для создания легковесных (lightweight) объектов Session.
Роль и ответственность:
- Фабрика сессий: Единственный источник для создания объектов
Session, которые представляют собой единицу работы с БД.Session session = sessionFactory.openSession(); - Кеширование метаданных: Хранит в памяти всю конфигурацию ORM:
- Маппинги сущностей (аннотации или XML).
- SQL-строки для основных операций.
- Информацию о второстепенном кеше (если настроен).
- Настройка соединения: Содержит информацию о пуле соединений (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. Представь себе здоровенный, неповоротливый ящик, который один раз на старте приложения грузят, а потом он стоит и пыхтит. И он потокобезопасный, то есть с ним можно со всех потоков одновременно работать, не боясь, что он сломается.
Зачем он вообще нужен, этот здоровяк?
- Фабрика сессий, ёпта. Его основная работа — штамповать лёгкие объекты
Session. Это как раз те самые рабочие лошадки, которые с базой общаются.Session session = sessionFactory.openSession(); // Дай-ка мне одну сессию, работничка! - Хранитель всех секретов. Он в своей памяти держит овердохуище метаданных: как твои классы связаны с таблицами, какие SQL-запросы готовить, про кеши всякие, если они есть. Одним словом, всю конфигурацию ORM он в себя впитал, как губка.
- Знает, как подключиться. В нём сидит вся инфа о пуле соединений, о диалекте базы данных (чтобы не говорить с 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.