1. Обзор
В этом кратком руководстве мы будем использовать Liquibase для разработки схемы базы данных веб-приложения Java.
Сначала мы сосредоточимся на общем Java-приложении, а также рассмотрим некоторые интересные варианты, доступные для Spring и Hibernate.
Очень кратко, ядром использования Liquibase является файл changeLog file – XML-файл, который отслеживает все изменения, которые необходимо выполнить для обновления базы данных.
Давайте начнем с зависимости Maven, которую нам нужно добавить в ваш pom.xml :
org.liquibase liquibase-core 3.4.1
Мы также можем проверить, есть ли более новая версия liquibase-core здесь .
Дальнейшее чтение:
Введение в откат ликвидной базы
Миграции баз данных с помощью Flyway
Краткое руководство по загрузке исходных данных с помощью пружинной загрузки
2. Журнал Изменений Базы Данных
Теперь давайте взглянем на простой файл changeLog – этот файл добавляет только столбец ” адрес “в таблицу” пользователи “:
Обратите внимание, как набор изменений идентифицируется с помощью id и author – чтобы убедиться, что он может быть однозначно идентифицирован и применен только один раз.
Давайте не будем смотреть, как подключить это к вашему приложению и убедиться, что оно запускается при запуске приложения.
3. Запустите Liquibase С пружинным бобом
Наш первый вариант запуска изменений при запуске приложения – через Spring bean. Конечно, есть много других способов, но если мы имеем дело с весенним приложением – это хороший, простой способ:
@Bean public SpringLiquibase liquibase() { SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setChangeLog("classpath:liquibase-changeLog.xml"); liquibase.setDataSource(dataSource()); return liquibase; }
Обратите внимание, как мы указываем на допустимый файл changeLog , который должен существовать в пути к классу.
4. Используйте Liquibase С Пружинным Загрузчиком
Если мы используем Spring Boot , нет необходимости определять bean для Liquibase, но нам все равно нужно убедиться, что мы добавили зависимость liquibase-core.
Затем все, что нам нужно, это поместить наш журнал изменений в ” db/changelog/db.changelog-master.yaml ” и миграции Liquibase будут выполняться автоматически при запуске.
Мы можем изменить файл журнала изменений по умолчанию, используя свойство ” liquibase.changelog “, например:
liquibase.change-log=classpath:liquibase-changeLog.xml
5. Отключите Liquibase в весенней загрузке
Иногда нам может потребоваться отключить выполнение миграции Liquibase при запуске.
Самый простой вариант, который у нас есть, – это использовать spring.liquibase.enabled свойство . Таким образом, вся оставшаяся конфигурация Liquibase остается нетронутой.
Вот пример для Spring Boot 2:
spring.liquibase.enabled=false
Для Spring Boot 1.x нам нужно использовать свойство liquibase.enabled :
liquibase.enabled=false
6. Создайте список изменений с помощью плагина Maven
Вместо того, чтобы писать файл changeLog вручную, мы можем использовать плагин Liquibase Maven для его создания и сэкономить много работы.
6.1. Конфигурация плагина
Вот изменения в вашем pom.xml :
... org.liquibase liquibase-maven-plugin 3.4.1 org.liquibase liquibase-maven-plugin 3.4.1 src/main/resources/liquibase.properties
6.2. Создание списка изменений Из Существующей базы данных
Мы можем использовать плагин для создания списка изменений из существующей базы данных:
mvn liquibase:generateChangeLog
Вот свойства liquibase :
url=jdbc:mysql://localhost:3306/oauth_reddit username=tutorialuser password=tutorialmy5ql driver=com.mysql.jdbc.Driver outputChangeLogFile=src/main/resources/liquibase-outputChangeLog.xml
Конечным результатом является файл changeLog , который мы можем использовать либо для создания исходной схемы БД, либо для заполнения данных. Вот как это будет выглядеть для нашего примера приложения:
...
6.3. Создайте список изменений Из Различий Между Двумя Базами Данных
Мы можем использовать плагин для создания файла changeLog из различий между двумя существующими базами данных (например, разработка и производство):
mvn liquibase:diff
Вот свойства:
changeLogFile=src/main/resources/liquibase-changeLog.xml url=jdbc:mysql://localhost:3306/oauth_reddit username=tutorialuser password=tutorialmy5ql driver=com.mysql.jdbc.Driver referenceUrl=jdbc:h2:mem:oauth_reddit diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml referenceDriver=org.h2.Driver referenceUsername=sa referencePassword=
А вот фрагмент сгенерированного Списка изменений :
Это очень мощный способ развития нашей БД, например, позволяя Hibernate автоматически генерировать новую схему для разработки, а затем использовать ее в качестве ориентира для старой схемы.
7. Используйте плагин Liquibase Hibernate
Если приложение использует Hibernate – мы рассмотрим очень полезный способ создания Журнала изменений , который является плагином liquibase-hibernate .
7.1. Конфигурация плагина
Во-первых, давайте настроим новый плагин и используем правильные зависимости:
org.liquibase liquibase-maven-plugin 3.4.1 src/main/resources/liquibase.properties org.liquibase.ext liquibase-hibernate4 3.5 org.springframework spring-beans 4.1.7.RELEASE org.springframework.data spring-data-jpa 1.7.3.RELEASE
7.2. Создание списка изменений на основе различий между базой данных и объектами персистентности
А теперь самое интересное. Мы можем использовать этот плагин для создания файла changeLog на основе различий между существующей базой данных (например, производственной) и нашими новыми объектами сохранения.
Поэтому – чтобы упростить задачу – как только объект будет изменен, мы можем просто сгенерировать изменения в старой схеме БД, получив чистый, мощный способ развития нашей схемы в производстве .
Вот свойства liquibase:
changeLogFile=classpath:liquibase-changeLog.xml url=jdbc:mysql://localhost:3306/oauth_reddit username=tutorialuser password=tutorialmy5ql driver=com.mysql.jdbc.Driver referenceUrl=hibernate:spring:org.baeldung.persistence.model ?dialect=org.hibernate.dialect.MySQLDialect diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml
Обратите внимание, что URL-адрес reference использует пакеты can, поэтому параметр dialect является обязательным.
8. Создайте список изменений в IntelliJ IDEA с помощью плагина JPA Buddy
Если мы используем не спящий режим ORM (например, EclipseLink или OpenJPA) или не хотим добавлять дополнительные зависимости, такие как плагин liquibase-hibernate , мы можем использовать JPA Buddy . Этот плагин IntelliJ IDEA интегрирует полезные функции Liquibase в IDE.
Чтобы создать дифференциальный Список изменений, просто установите плагин, а затем вызовите действие из панели структуры JPA. Выберите, какой источник вы хотите сравнить (база данных, объекты JPA или снимок Liquibase) с какой целью (база данных или снимок Liquibase).
JPA Buddy сгенерирует Список изменений как показано в анимации ниже:
Еще одним преимуществом JPA Buddy перед плагином liquibase-hibernate является возможность переопределять сопоставления по умолчанию между типами Java и базами данных. Кроме того, он корректно работает с пользовательскими типами Hibernate и конвертерами JPA.
9. Заключение
В этой статье мы проиллюстрировали несколько способов использования Liquibase и перехода к безопасному и зрелому способу разработки и рефакторинга схемы БД Java-приложения .
Реализация всех этих примеров и фрагментов кода доступна на GitHub .