← Назад к вопросам

Что такое SessionFactory?

2.2 Middle🔥 151 комментариев
#ORM и Hibernate

Комментарии (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

  1. Connection Pool — управляет БД соединениями
  2. Dialect — SQL диалект конкретной БД
  3. Mapping metadata — информация о всех сущностях и отношениях
  4. 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 и другие ресурсы.