«1. Обзор

В этом руководстве мы рассмотрим новый механизм, с помощью которого мы можем инициализировать и запустить Hibernate SessionFactory. Особое внимание мы уделим новому родному процессу начальной загрузки, поскольку он был переработан в версии 5.0.

До версии 5.0 приложения должны были использовать класс Configuration для начальной загрузки SessionFactory. Этот подход теперь устарел, так как документация Hibernate рекомендует использовать новый API на основе ServiceRegistry.

Проще говоря, создание SessionFactory — это реализация ServiceRegistry, которая содержит службы, необходимые для Hibernate, как во время запуска, так и во время выполнения.

2. Зависимости Maven

Прежде чем мы начнем изучать новый процесс начальной загрузки, нам нужно добавить файл jar hibernate-core в путь к классам проекта. В проекте на основе Maven нам просто нужно объявить эту зависимость в файле pom.xml:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.0.Final</version>
</dependency>

Поскольку Hibernate является поставщиком JPA, это также будет транзитивно включать зависимость JPA API.

Нам также нужен JDBC-драйвер базы данных, с которой мы работаем. В этом примере мы будем использовать встроенную базу данных H2:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.197</version>
</dependency>

Не стесняйтесь проверять последние версии hibernate-core и драйвера H2 на Maven Central.

3. API начальной загрузки

Начальная загрузка относится к процессу создания и инициализации SessionFactory.

Для достижения этой цели нам нужен ServiceRegistry, содержащий службы, необходимые для Hibernate. Из этого реестра мы можем создать объект метаданных, который представляет модель предметной области приложения и ее сопоставление с базой данных.

Давайте рассмотрим эти основные объекты более подробно.

3.1. Служба

Прежде чем мы углубимся в концепцию ServiceRegistry, нам сначала нужно понять, что такое служба. В Hibernate 5.0 Служба — это тип функциональности, представленный одноименным интерфейсом:

org.hibernate.service.Service

По умолчанию Hibernate предоставляет реализации для наиболее распространенных Служб, и в большинстве случаев их достаточно. В противном случае мы можем создать наши собственные Сервисы, чтобы либо изменить исходные функции Hibernate, либо добавить новые.

В следующем подразделе мы покажем, как Hibernate делает эти службы доступными через облегченный контейнер под названием ServiceRegistry.

3.2. ServiceRegistry

Первым шагом в построении SessionFactory является создание ServiceRegistry. Это позволяет поддерживать различные службы, которые предоставляют функции, необходимые для Hibernate, и основаны на функциях Java SPI.

С технической точки зрения мы можем рассматривать ServiceRegistry как легковесный инструмент для внедрения зависимостей, в котором bean-компоненты относятся только к типу Service.

Существует два типа ServiceRegistry, и они иерархические. Первый — это BootstrapServiceRegistry, который не имеет родителя и содержит следующие три обязательные службы:

    ClassLoaderService: позволяет Hibernate взаимодействовать с ClassLoader различных сред выполнения. IntegratorService: контролирует обнаружение и управление службой Integrator, разрешая сторонние приложения. для интеграции с Hibernate StrategySelector: разрешает реализации различных контрактов стратегии. — это StandardServiceRegistry, основанный на предыдущем BootstrapServiceRegistry и содержащий три службы, упомянутые выше. Кроме того, он содержит различные другие службы, необходимые Hibernate, перечисленные в классе StandardServiceInitiators.

Как и в предыдущем реестре, мы используем StandardServiceRegistryBuilder для создания экземпляра StandardServiceRegistry:

BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder()
  .applyClassLoader()
  .applyIntegrator()
  .applyStrategySelector()
  .build();

Под капотом StandardServiceRegistryBuilder создает и использует экземпляр BootstrapServiceRegistry. Мы также можем использовать перегруженный конструктор для передачи уже созданного экземпляра:

«

StandardServiceRegistryBuilder standardServiceRegistry =
  new StandardServiceRegistryBuilder();

«Мы используем этот построитель для загрузки конфигурации из файла ресурсов, такого как файл по умолчанию hibernate.cfg.xml, и, наконец, мы вызываем метод build() для получения экземпляра StandardServiceRegistry.

BootstrapServiceRegistry bootstrapServiceRegistry = 
  new BootstrapServiceRegistryBuilder().build();
StandardServiceRegistryBuilder standardServiceRegistryBuilder = 
  new StandardServiceRegistryBuilder(bootstrapServiceRegistry);

3.3. Метаданные

StandardServiceRegistry standardServiceRegistry = standardServiceRegistryBuilder
  .configure()
  .build();

Настроив все необходимые службы путем создания экземпляра ServiceRegistry типа BootstrapServiceRegistry или StandardServiceRegistry, теперь нам нужно обеспечить представление модели домена приложения и сопоставление его базы данных.

За это отвечает класс MetadataSources:

Далее мы получаем экземпляр Metadata, который будем использовать на последнем шаге:

MetadataSources metadataSources = new MetadataSources(standardServiceRegistry);
metadataSources.addAnnotatedClass();
metadataSources.addResource()

3.4. SessionFactory

Metadata metadata = metadataSources.buildMetadata();

Последний шаг — создание SessionFactory из ранее созданных метаданных:

Теперь мы можем открыть сеанс и начать сохранять и читать сущности:

SessionFactory sessionFactory = metadata.buildSessionFactory();

4. Заключение

Session session = sessionFactory.openSession();
Movie movie = new Movie(100L);
session.persist(movie);
session.createQuery("FROM Movie").list();

В В этой статье мы рассмотрели шаги, необходимые для создания SessionFactory. Хотя процесс кажется сложным, мы можем суммировать его в три основных шага: сначала мы создали экземпляр StandardServiceRegistry, затем мы создали объект метаданных и, наконец, мы создали SessionFactory.

Полный код этих примеров можно найти на Github.

«