Ответ
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.