我试图使用liquibase-hibernate5(Spring-5.0.4.RELEASE,Hibernate-5.2.15)通过liquibase-maven-plugin在Hibernate实体(来自单个基本包)和干净数据库(Oracle 11gR2 XE)之间生成差异 . 最后,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文档似乎也没有提供太多帮助(可能我只能看到冰山一角);但请,有人可以帮忙吗?或者可能会指出我错过的一些非常基本的东西 . :(