Настройки проекта и подключение liquibase
Нужно быть внимательными Hibernate и liquibase генерят немного разные названия колонок. При накатывании changeset колонка дропнется вместе со всеми данными
Лучше всего при подключении liquibase на существующий проект добиться чтобы при первом diff changeset был пуст
Для устранения неоднозначностей навешиваем аннотации @Column(name = “…”) на поля Entity
Настройки в файл application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/my_db?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.ddl-auto=none (или verify)
Добавляем в pom.xml зависимость
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
Теперь необходимо добавить сам Liquibase скрипт, который будет создавать нужную нам таблицу. Создаем в папке /src/main/resources/db/changelog файл с именем db.changelog-master.yaml и добавляем в него следующее содержимое
Open spoiler
```java databaseChangeLog: - logicalFilePath: db/changelog/db.changelog-lesson1.yaml - changeSet: id: 1 author: your_liquibase_username changes: - createTable: tableName: users columns: - column: name: id type: BIGINT autoIncrement: true constraints: primaryKey: true nullable: false - column: name: username type: varchar(50) constraints: unique: true nullable: false - column: name: password type: varchar(512) constraints: nullable: false - column: name: first_name type: varchar(50) - column: name: last_name type: varchar(50) - column: name: email type: varchar(50) ```Это если создавать БД с чистого листа и changeset-ами. Но задача стоит немного иначе. Уже есть схема БД созданная Hibernate-ом по Entity Нужно создавать changeset по измененным Entity, а потом получившийся diff - changeset накатывать на БД с помощью liquibase
Для этого добваляем maven-plugin
секция build файла pom.xml
```Файл pom.xml целиком
```Убедимся что есть директория src/main/resources/db/changelog
В resources нужен файл liquibase-maven-plugin.properties с настройками плагина.
changeLogFile= @project.basedir@/src/main/resources/db/changelog/db.changelog-master.yaml
url= jdbc:mysql://localhost:3306/geek_db?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username= root
password=
driver= com.mysql.cj.jdbc.Driver
referenceUrl=hibernate:spring:com.example.liquibase_demo.model?dialect=org.hibernate.dialect.MySQLDialect
diffChangeLogFile= @project.basedir@/src/main/resources/db/changelog/db.changelog-@timestamp@.yaml
ignoreClasspathPrefix= true
Обращаем внимание на правильность пакетного пути до наших Entity в параметре referenceUrl В файле db.changelog-master.yaml перед первым запуском не должно быть changeset-ов, чтобы не убить существующую схему БД. Запускаем:
- mvn clean
- install
- liquibase:diff
Это удобно вызывать из меню mavem справа вверху в idea.
Если Entity и схема БД у нас разные (мы добавили/исправили Entity) в папке src/main/resources/db/changelog у нас появится diff-файл с changeset-ом Этот changeset после проверки необходимо накатить на БД. Для этого инклюдим его в db.changelog-master.yaml Например:
- include:
file: db.changelog-20210729-054643592.yaml
relativeToChangelogFile: true
Перезапускаем приложение изменения должны накатиться на БД.
В итоге получаем такую схему:
- Изменяем/добавляем Entity
- Получаем diff-файл с changeset-ом
- Инклюдим cangeset в db.changelog-master.yaml и перезапускаем приложение
- Изменения накатываются на БД
Links: