Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# SessionFactory в Hibernate
SessionFactory — это центральный объект Hibernate, который отвечает за создание объектов Session. Это потокобезопасная фабрика, которая управляет дорогостоящими ресурсами (connection pools, statement caches) и должна создаваться один раз при запуске приложения.
Ключевые характеристики
SessionFactory является:
- Immutable и потокобезопасной
- Дорогостоящей в создании (содержит metadata всех mapped классов)
- Долгоживущей (существует всё время жизни приложения)
- Singleton для каждого database конфигурации
Как создать SessionFactory
// До Hibernate 5.2
SessionFactory sessionFactory = new Configuration()
.configure() // читает из hibernate.cfg.xml
.addAnnotatedClass(User.class)
.buildSessionFactory();
// Hibernate 5.2+ (рекомендуется)
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml")
.build();
SessionFactory sessionFactory = new MetadataSources(registry)
.addAnnotatedClass(User.class)
.getMetadataBuilder()
.build()
.buildSessionFactory();
// Spring Boot (автоматизирует всё)
// просто добавь зависимость spring-boot-starter-data-jpa
Использование для создания Session
// Получить новую Session из SessionFactory
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
try {
User user = new User();
user.setName("John");
session.save(user);
tx.commit();
} catch (Exception e) {
tx.rollback();
throw e;
} finally {
session.close();
}
Ресурсы, управляемые SessionFactory
- Connection Pool — управляет БД соединениями
- Dialect — SQL диалект конкретной БД
- Mapping metadata — информация о всех сущностях и отношениях
- Cache — second-level cache для часто используемых объектов
Pattern: Singleton SessionFactory
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration()
.configure()
.buildSessionFactory();
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
if (sessionFactory != null) {
sessionFactory.close();
}
}
}
SessionFactory vs Session
- SessionFactory — потокобезопасная, создаётся один раз, живёт долго
- Session — НЕ потокобезопасная, создаётся для каждого запроса/операции, закрывается быстро
Закрытие SessionFactory
Обязательно закрой SessionFactory при выключении приложения:
sessionFactory.close();
Это освобождает connection pool и другие ресурсы.