Подключение базы и Dev Services
Пока посты хранятся в памяти и пропадают при каждом перезапуске. Пора подключить базу данных. Для этого нужны два расширения: Hibernate ORM с Panache — работа с таблицами через Java-классы — и JDBC-драйвер конкретной базы. Обычно в Quarkus сначала думают не об адресе базы и пароле, а о том, нужна ли вообще настройка: в режиме разработки базу поднимает Dev Services.
Подключение расширений
./mvnw quarkus:add-extension -Dextensions="hibernate-orm-panache,jdbc-h2"В pom.xml появятся quarkus-hibernate-orm-panache и quarkus-jdbc-h2. H2 — небольшая база данных, написанная на Java. Она работает прямо внутри приложения и ничего не требует устанавливать, поэтому удобна для учёбы. Для настоящего сервера чаще берут PostgreSQL — расширение jdbc-postgresql.
Что такое Dev Services
Dev Services — функция Quarkus, которая в режимах dev и test сама запускает нужные сервисы: базу данных, брокер сообщений, Redis. Условие одно: адрес сервиса не указан в настройках. Quarkus видит драйвер в зависимостях, видит, что quarkus.datasource.jdbc.url не задан, и поднимает базу сам.
Как именно поднимает, зависит от базы:
| База | Как запускает Dev Services | Нужен Docker |
|---|---|---|
| H2, Derby | Внутри приложения | Нет |
| PostgreSQL, MySQL, MariaDB и др. | В контейнере через Testcontainers | Да (или Podman) |
Мы используем H2, поэтому Docker не нужен. Если Docker у вас установлен, можно взять jdbc-postgresql: тогда Dev Services скачает образ PostgreSQL и запустит его в контейнере — код уроков останется тем же.
Запуск
Файл application.properties про базу ничего не говорит. Когда в проекте появится первая сущность (её мы создадим в следующем уроке), ./mvnw quarkus:dev напечатает при старте (вывод сокращён):
INFO [io.quarkus.hibernate.orm.deployment.dev.HibernateOrmDevServicesProcessor] Setting [quarkus.hibernate-orm.schema-management.strategy]=drop-and-create to initialize Dev Services managed database
ERROR [org.testcontainers.dockerclient.DockerClientProviderStrategy] Could not find a valid Docker environment. Please check configuration.
INFO [io.quarkus.datasource.deployment.devservices.DevServicesDatasourceProcessor] Dev Services for default datasource (h2) started
INFO [io.quarkus] Installed features: [agroal, cdi, compose, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-h2, narayana-jta, rest, rest-jackson, ...]
Строка Dev Services for default datasource (h2) started значит, что база запущена. Строка ERROR про Docker появляется на компьютере без Docker: Quarkus проверяет, есть ли он, но для H2 он не нужен, и приложение работает дальше.
Схема таблиц
Первая строка лога говорит о drop-and-create: при каждом старте Hibernate удаляет таблицы и создаёт их заново по Java-классам. Для разработки это удобно — схема всегда совпадает с кодом. Но данные при перезапуске пропадают, поэтому в следующем уроке мы будем заполнять базу при старте.
Значение schema-management.strategy | Что делает |
|---|---|
drop-and-create | Пересоздаёт таблицы при старте |
update | Добавляет новые таблицы и столбцы, данные сохраняет |
validate | Только проверяет, что схема совпадает |
none | Ничего не делает |
База для сервера
В профиле prod Dev Services не работает, поэтому адрес нужно указать явно. Для учебного проекта возьмём H2 в файле:
# src/main/resources/application.properties
%prod.quarkus.datasource.jdbc.url=jdbc:h2:file:./data/blog
%prod.quarkus.hibernate-orm.schema-management.strategy=updateБаза будет храниться в файле data/blog.mv.db рядом с местом запуска. Для PostgreSQL на сервере настройки выглядят так, а пароль передают переменной окружения QUARKUS_DATASOURCE_PASSWORD:
# src/main/resources/application.properties
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/blog
%prod.quarkus.datasource.username=blog
%prod.quarkus.datasource.password=changemeЧастая ошибка
Если запустить собранное приложение без адреса базы, оно не стартует:
Unable to find datasource '<default>' for persistence unit '<default>': Bean is not active
Reason: Datasource '<default>' was deactivated automatically because its URL is not set.
To activate the datasource, set configuration property 'quarkus.datasource.jdbc.url'.
В dev всё работало благодаря Dev Services, а в prod их нет. Задайте %prod.quarkus.datasource.jdbc.url в файле или переменную окружения QUARKUS_DATASOURCE_JDBC_URL.