복붙노트

[SPRING] 여러 스키마의 엔티티에 대한 Liquibase-hibernate 변경 로그 생성

SPRING

여러 스키마의 엔티티에 대한 Liquibase-hibernate 변경 로그 생성

liquibase-hibernate5 (Spring-5.0.4.RELEASE, Hibernate-5.2.15)를 사용하는 liquibase-maven-plugin을 통해 (단일 기본 패키지의) Hibernate 엔티티와 깨끗한 데이터베이스 (Oracle 11gR2 XE) 사이의 diff를 생성하려고합니다. 모든 (전체) 프로그래밍 방식 구성으로 서블릿 3.1에 대한 JPA-2.1.1 응용 프로그램). JSON을 변경 로그 형식으로 사용하고 liquibase-maven-plugin (v3.5.5)을 사용하여 liquibase-hibernate5 (v3.6)를 사용하고 있습니다. 구성에서 사용되는 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

모두 오류없이 잘 작동하는 것으로 보이며 이전의 빈 changelog 파일에는 적용 가능한 모든 변경 집합이 채워집니다. 그러나 내가 알아낼 수없는 한 가지 문제가 있습니다.

실제로, 모든 엔티티는 그룹화되어 스키마 (예 : 분리, 마이크로 서비스와 함께 사용) (이 질문의 범위를 벗어남)로 그룹화됩니다. 연결하려는 데이터베이스 사용자 (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에서 이름이 "SCHEMA1.some_id_seq"인 시퀀스를 나타냅니다.

내가 기대하는 바는 이러한 변경 집합은 각각의 스키마에서 DDL을 실행하기 위해 mvn liquibase : update에 알려주는 것이어야한다는 것입니다. 나는 생성 된 changesets를 실행하려고 시도하고 매번 db_user 스키마 (changelog 및 changelog 잠금 테이블 만 표시 될 것으로 예상되는)에서 생성 된 모든 객체를 갖게됩니다.

StackOverflow 및 기타 사이트를 통해 샅샅이 조사했지만 문제가있는 사람 (해결책 또는 도움말 사용)은 내 것과 비슷하지 않습니다. Liquibase 문서도 도움이되지 않는 것 같습니다 (빙산의 일각을 볼 수 있습니다). 제발, 아무도 여기 도와 줄 수 없어? 아니면 제가 놓친 매우 근본적인 것을 지적 할 수도 있습니다. :(

해결법

    from https://stackoverflow.com/questions/49572881/liquibase-hibernate-changelog-generation-for-entities-in-multiple-schemas by cc-by-sa and MIT license