Рубрики
Без рубрики

Hibernate 5 Bootstrapping API

Узнайте, как использовать новый собственный процесс начальной загрузки, представленный в Hibernate 5

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

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


    org.hibernate
    hibernate-core
    5.4.0.Final

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

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


    com.h2database
    h2
    1.4.197

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

3. Bootstrapping API

Bootstrapping относится к процессу создания и инициализации SessionFactory.

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

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

3.1. Обслуживание

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

org.hibernate.service.Service

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

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

3.2. Сервисная логистика

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

Технически говоря, мы можем рассматривать реестр Service как легкий инструмент внедрения зависимостей, где бобы имеют только тип Service.

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

  • ClassLoaderService: позволяет Hibernate взаимодействовать с ClassLoader различных сред выполнения
  • Служба интегратора: управляет обнаружением и управлением службой Интегратора , позволяющей сторонним приложениям интегрироваться с Hibernate
  • Strategy Selector: разрешает реализацию различных стратегических контрактов

Для построения реализации bootstrap ServiceRegistry мы используем класс Bootstrap Serviceregistrybuilder factory, который позволяет настраивать эти три службы типобезопасным способом:

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

Второй Сервисный реестр – это StandardServiceRegistry , который строится на предыдущем BootstrapServiceRegistry и содержит три Службы , упомянутые выше . Кроме того, он содержит различные другие Сервисы , необходимые Hibernate, перечисленные в классе Standard Service Initiators .

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

StandardServiceRegistryBuilder standardServiceRegistry =
  new StandardServiceRegistryBuilder();

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

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, теперь нам нужно предоставить представление модели домена приложения и его сопоставления с базой данных.

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

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 , затем мы построили объект Metadata и, наконец, мы построили SessionFactory.

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