Liquibase-hibernate5 (Spring-5.0.4.RELEASE、Hibernate-5.2.15.最終的な JPA-2.1.1 アプリケーションは、サーブレット 3.1 をすべて (完全に) プログラムで構成します)。変更ログ形式として JSON を使用し、liquibase-maven-plugin (v3.5.5) で liquibase-hibernate5 (v3.6) を使用しています。config で使用されている 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
次に、練習に従って使用する差分を実行するために:
mvn liquibase:diff
すべてがエラーなしで正常に機能しているように見え、以前の空の変更ログ ファイルには適用可能なすべての変更セットが取り込まれています。しかし、私が理解できないように見える1つの問題があります。
実際、私のすべてのエンティティはグループ化され、スキーマ間で分割されています(分離、マイクロサービスでの使用など(この質問の範囲外))。接続しようとしているデータベースユーザー(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 の schema 属性によって割り当てられます)。これにより、すべての移行が 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"
}
}]
}
}
シーケンス名に注意してください。これは、db_user の「SCHEMA1.some_id_seq」という名前のシーケンスを表し、「SCHEMA1」の「some_id_seq」という名前のシーケンスではありません。
私が期待しているのは、これらの変更セットが mvn liquibase:update にそれぞれのスキーマで DDL を実行するように指示するものを表す必要があるということです。生成された変更セットを実行しようとしましたが、すべてのオブジェクトが db_user スキーマで作成されるたびに終了します (変更ログと変更ログ ロック テーブルのみが表示されることを期待しています)。
私は StackOverflow と他のいくつかのサイトを精査しましたが、私のような問題 (解決策またはヒント) を抱えている人を見つけることができませんでした。Liquibase のドキュメントもあまり役に立ちません (氷山の一角しか見えないかもしれません)。でもお願いします、ここで誰か助けてくれませんか?または、私が見逃した非常に基本的なことを指摘するかもしれません。:(