Liquibase diff не работает для @SecondaryTable - PullRequest
0 голосов
/ 01 апреля 2020

Если я добавлю в мое приложение 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 кажется, что та же проблема, но без ответа ...

Спасибо за любой совет.

...