Почему SessionFactory в Hibernate считается тяжеловесным объектом?

«Почему SessionFactory в Hibernate считается тяжеловесным объектом?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, SessionFactory в Hibernate — это тяжеловесный (heavyweight), потокобезопасный объект, который создается один раз на всё приложение. Его «тяжесть» обусловлена сложной и ресурсоемкой инициализацией.

Причины:

  • Singleton на уровне приложения: Создается при старте и используется всеми потоками.
  • Затратная инициализация: В процессе построения выполняются:
    • Чтение и парсинг конфигурации (hibernate.cfg.xml или аннотации).
    • Построение и валидация метамодели всех сущностей (ORM-маппинг).
    • Создание и наполнение кешей второго уровня и кеша запросов (если включены).
    • Генерация и подготовка SQL-запросов для основных операций.

Пример создания (устаревший, но наглядный API):

Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
        .applySettings(configuration.getProperties()).build();
// Этот вызов выполняет всю тяжелую работу
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

Best practice: Создавайте SessionFactory единожды при запуске приложения (например, в ServletContextListener или с помощью LocalSessionFactoryBean в Spring) и используйте dependency injection для его переиспользования. Обязательно закрывайте (sessionFactory.close()) при остановке приложения для освобождения ресурсов.