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();
Второй ServiceRegistry
— StandardServiceRegistry
, основанный на предыдущем 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 .