Перейти к основному содержимому

API начальной загрузки Hibernate 5

· 4 мин. чтения

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. Реестр Сервисов

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

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

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

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

Для создания реализации BootstrapServiceRegistry мы используем фабричный класс BootstrapServiceRegistryBuilder , который позволяет настраивать эти три службы безопасным для типов способом:

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

Второй ServiceRegistryStandardServiceRegistry , основанный на предыдущем BootstrapServiceRegistry и содержащий три службы , упомянутые выше . Кроме того, он содержит различные другие службы , необходимые Hibernate, перечисленные в классе StandardServiceInitiators .

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

StandardServiceRegistryBuilder standardServiceRegistry =
new StandardServiceRegistryBuilder();

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

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

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

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

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

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

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

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

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

Metadata metadata = metadataSources.buildMetadata();

3.4. SessionFactory

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

SessionFactory sessionFactory = metadata.buildSessionFactory();

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

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

4. Вывод

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

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