Если я добавлю в мое приложение spring-boot / hibernate сущность со вторичной таблицей, определенной, например, следующим образом (взято из https://www.baeldung.com/jpa-mapping-single-entity-to-multiple-tables):
@Entity
@Table(name = "meal")
@SecondaryTable(name = "allergens", pkJoinColumns = @PrimaryKeyJoinColumn(name = "meal_id"))
class Meal {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
Long id;
@Column(name = "name")
String name;
@Column(name = "description")
String description;
@Column(name = "price")
BigDecimal price;
@Embedded
Allergens allergens;
// standard getters and setters
}
@Embeddable
class Allergens {
@Column(name = "peanuts", table = "allergens")
boolean peanuts;
@Column(name = "celery", table = "allergens")
boolean celery;
@Column(name = "sesame_seeds", table = "allergens")
boolean sesameSeeds;
// standard getters and setters
}
, и я выполню Команда liquibase diff, чтобы увидеть разницу между сущностями в коде и базовой базой данных (PostgreSQL или MySQL - это не имеет значения), я получаю только один набор изменений:
<changeSet author="jakub (generated)" id="1585730629323-1">
<createTable tableName="meal">
<column autoIncrement="true" name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="mealPK"/>
</column>
<column name="description" type="VARCHAR(255)"/>
<column name="name" type="VARCHAR(255)"/>
<column name="price" type="numeric(19, 2)"/>
</createTable>
</changeSet>
для таблицы meal
но ничего для таблицы allergens
!
Похоже, Liquibase знает, что столбцы allergens
принадлежат другой (вторичной) таблице, но не создает для нее набор изменений. Это ошибка в Liquibase?
Если я позволю Hibernate генерировать таблицы, он правильно создаст и вторичную таблицу allergens
в базе данных. Если я теперь запускаю команду diff во второй раз, она генерирует changeSet, который собирается удалить таблицу allergens
из базы данных - это плохо. Любые идеи, как заставить Liquibase распознавать вторичную таблицу?
Мой профиль Maven, используемый для запуска diff:
<profile>
<id>db-diff-postgresql</id>
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.8.7</version>
<executions>
<execution>
<id>generate-db-diff-postgresql</id>
<phase>process-test-resources</phase>
<goals>
<goal>diff</goal>
</goals>
<configuration>
<propertyFile>src/main/resources/db/liquibase-postgresql.properties</propertyFile>
<diffChangeLogFile>src/main/resources/db/changelogs/postgresql/changelog_diff_postgresql_${maven.build.timestamp}.xml</diffChangeLogFile>
<logging>debug</logging>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
и liquibase-postgresql.properties
:
changeLogFile= src/main/resources/db/db.changelog.xml
driver= org.postgresql.Driver
url= jdbc:postgresql://localhost/myApp
username= postgres
password= password
referenceUrl= hibernate:spring:myapp.jpa.entity?dialect=org.hibernate.dialect.PostgreSQLDialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
Здесь: https://liquibase.jira.com/browse/CORE-3029 кажется, что та же проблема, но без ответа ...
Спасибо за любой совет.