Liquibase-hibernate changelog для сущностей в нескольких схемах

Я пытаюсь сгенерировать diff между сущностями Hibernate (из одного базового пакета) и чистой базой данных (Oracle 11gR2 XE) с помощью liquibase-maven-plugin с использованием liquibase-hibernate5 (Spring-5.0.4.RELEASE, Hibernate-5.2.15. Финальное приложение JPA-2.1.1 поверх сервлета 3.1 со всей (полной) программной конфигурацией). Я использую JSON в качестве формата журнала изменений и liquibase-hibernate5 (v3.6) с liquibase-maven-plugin (v3.5.5). Версия спецификации JPA, используемая в конфигурации - 2.1.1. Фрагмент из POM:

            <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>${liquibase.mvn.plugin.version}</version>
            <dependencies>
                <dependency>
                    <groupId>org.liquibase</groupId>
                    <artifactId>liquibase-core</artifactId>
                    <version>${liquibase.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.liquibase.ext</groupId>
                    <artifactId>liquibase-hibernate5</artifactId>
                    <version>${liquibase.hibernate.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-beans</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-orm</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context-support</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.eclipse.persistence</groupId>
                    <artifactId>javax.persistence</artifactId>
                    <version>${jpa.version}</version>
                </dependency>
                <dependency>
                    <groupId>javax.validation</groupId>
                    <artifactId>validation-api</artifactId>
                    <version>${validation.api.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.oracle.jdbc</groupId>
                    <artifactId>ojdbc8</artifactId>
                    <version>${jdbc.driver.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.yaml</groupId>
                    <artifactId>snakeyaml</artifactId>
                    <version>${snakeyaml.version}</version>
                </dependency>
            </dependencies>
            <configuration>
                <propertyFile>src/main/resources/jdbc/schema/liquibase.properties</propertyFile>
                <propertyFileWillOverride>true</propertyFileWillOverride>
                <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>diff</goal>
                        <goal>update</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Вот мой текущий liquibase.properties:

url: jdbc:oracle:thin:@localhost:1521/xe
username: db_user
password: password
driver: oracle.jdbc.OracleDriver
referenceUrl: hibernate:spring:org.example.something.entities?dialect=org.hibernate.dialect.Oracle10gDialect
changeLogFile: src/main/resources/jdbc/schema/db-changelog.json
diffChangeLogFile: src/main/resources/jdbc/schema/db-changelog.json

outputDefaultCatalog: false
outputDefaultSchema: false
outputFileEncoding: utf-8

Затем для запуска diff я использую в соответствии с практикой:

mvn liquibase:diff

Кажется, что все работает хорошо без ошибок, и ранее пустой файл журнала изменений заполняется всеми применимыми наборами изменений; но с одной проблемой, которую я не могу понять.

На самом деле все мои сущности сгруппированы и разделены по схемам (для разделения, использования с микросервисами и т. Д. (Выход за рамки этого вопроса). Пользователь базы данных (скажем, db_user), с которым я пытаюсь соединиться, обладает всеми необходимыми привилегиями для создания таблицы во всех схемах приложения, в которых будут храниться данные. Предположим, что schema1 и schema2 являются схемами, к которым относятся таблицы для сущностей ниже:

org.example.something.entities.package1.EntityOne
org.example.something.entities.package2.EntityTwo

Выписка из организаций:

@javax.persistence.Entity
@javax.persistence.Table(schema = "SCHEMA1", name = "TABLE1")
public class EntityOne implements Serializable {
// class code ommitted for brevity

@javax.persistence.Entity
@javax.persistence.Table(schema = "SCHEMA2", name = "TABLE2")
public class EntityTwo implements Serializable {
// class code ommitted for brevity

Теперь проблема в том, что когда генерируются наборы изменений, они не имеют никакой информации об именах схем (как назначено атрибутом схемы javax.persistence.Table). Это приведет к тому, что все миграции будут выполняться только в db_user, что здесь нежелательно. В случае последовательностей, пример кода ниже:

@Id
@Column(name = "id", columnDefinition = "number(18,0)")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "some_id-gen")
@SequenceGenerator(name = "some_id-gen", schema = "SCHEMA1", initialValue = 1001,
    allocationSize = 1, sequenceName = "some_id_seq")
private Long id;

Сгенерированный набор изменений выглядит так:

{
  "changeSet": {
  "id": "1522402677220-1",
  "author": "os user (generated)",
  "changes": [
    {
      "createSequence": {
        "sequenceName": "SCHEMA1.some_id_seq"
      }
    }]
  }
}

Обратите внимание на имя последовательности, оно представляет последовательность с именем "SCHEMA1.some_id_seq" в db_user, а не последовательность с именем "some_id_seq" в "SCHEMA1".

Я ожидаю, что эти наборы изменений должны представлять что-то, что говорит mvn liquibase:update для запуска DDL в соответствующих схемах. Я попытался запустить сгенерированные наборы изменений, и каждый раз я получаю все объекты, созданные в схеме db_user (в которой я ожидаю, что будут отображаться только таблицы изменений и блокировки).

Я просмотрел Stackru и несколько других сайтов, но не смог найти никого с проблемой (с решением или советами), похожей на мою. Документация Liquibase также, кажется, не предлагает большой помощи (возможно, я вижу только верхушку айсберга); но, пожалуйста, кто-нибудь может помочь здесь? Или, может быть, указать на что-то очень фундаментальное, что я пропустил.:(

0 ответов

Другие вопросы по тегам