6

我正在尝试使用 liquibase-hibernate5(Spring-5.0.4.RELEASE,Hibernate-5.2.15.最终,JPA-2.1.1 应用程序在 servlet 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

然后为了运行我根据实践使用的差异:

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"
      }
    }]
  }
}

请注意序列名称,它表示 db_user 中名称为“SCHEMA1.some_id_seq”的序列,而不是“SCHEMA1”中名称为“some_id_seq”的序列。

我期望的是这些变更集应该代表一些东西,告诉 mvn liquibase:update 在各自的模式中运行 DDL。我已经尝试运行生成的变更集,并且每次我最终都在 db_user 模式中创建了所有对象(我只希望在其中显示更改日志和更改日志锁定表)。

我浏览了 StackOverflow 和其他一些网站,但找不到与我类似的问题(有解决方案或提示)的人。Liquibase 文档似乎也没有提供太多帮助(也许我只能看到冰山一角);但是拜托,有人可以帮忙吗?或者可能会指出我错过的一些非常基本的东西。:(

4

0 回答 0