[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
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 부트로 JSON 및 HTML 용 컨트롤러 (0) | 2019.03.31 |
---|---|
[SPRING] Spring 부트는 web.xml과 같이 <async-supported> 사용 가능 (0) | 2019.03.31 |
[SPRING] Spring 애플리케이션에서 요청, 세션, 애플리케이션 범위를 사용해야하는 경우 (0) | 2019.03.31 |
[SPRING] Jspx 파일 및 조건부 주석 (0) | 2019.03.31 |
[SPRING] 어노테이션으로 최대 절전 모드에서 데이터베이스 스키마의 유효성을 검사하는 방법 (0) | 2019.03.31 |