![](/img/trans.png)
[英]How to create diff changelog file from JPA entities for different databases at the same time?
[英]Liquibase not creating diff changelog based on JPA Entities
我試圖在已經提出的問題以及一些用戶推薦的這篇文章中找到答案: http : //www.operatornew.com/2012/11/automatic-db-migration-for-java-web.html但沒有運氣好的話。
問題是我使用 Maven 構建工具和 Postgres DB 為我的 Java 項目完整配置了 Liquibase,但即使我已經定義了 Hibernate 實體,Liquibase diff也沒有考慮它們,並且不會基於 JPA 注釋實體生成變更鎖.
我嘗試了所有方法,但使用空的changelock-master.xml並定義了 2 個實體,結果diff.xml為空。
這是我的pom.xml :
<!--LIQUIBASE-->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.4.1</version>
</dependency>
...
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.5.3</version>
<dependencies>
<dependency>
<groupId>org.liquibase.ext</groupId>
<artifactId>liquibase-hibernate4</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.7.3.RELEASE</version>
</dependency>
</dependencies>
<configuration>
<propertyFile>src/main/resources/liquibase.properties</propertyFile>
<changeLogFile>src/main/resources/db/changelog/changelog-master.xml</changeLogFile>
</configuration>
</plugin>
在這里,我定義了liquibase.properties :
referenceUrl=hibernate:spring:com.victus.applied.entity?dialect=org.hibernate.dialect.PostgreSQLDialect
referenceDriver=liquibase.ext.hibernate.database.connection.HibernateDriver
referenceUsername=testusername
referencePassword=
driver=org.postgresql.Driver
url=jdbc:postgresql://localhost:5432/applied
username=testusername
password=
changeLogFile=src/main/resources/db/changelog/changelog-master.xml
diffChangeLogFile=src/main/resources/liquibase-diff.xml
outputChangeLogFile=src/main/resources/db/changelog/changelog-master.xml
在我的application.properties 中,我還有:
##Liquibase
spring.liquibase.change-log=classpath:/db/changelog/changelog-master.xml
logging.level.liquibase = INFO
##Postgres DB
spring.datasource.url= jdbc:postgresql://localhost:5432/applied
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.username=wiktordyngosz
spring.datasource.password=
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.messages.basename=validation
我定義了兩個簡單的實體,例如其中之一:
@Entity
@Table(name = "user")
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String username;
@NotNull
private String password;
@Transient
private String passwordConfirm;
@ManyToMany
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
}
當我有一個空的changelock-master.xml文件並調用mvn liquibase:diff以根據我的實體生成 changelock 時,生成的 changelock 為空。 日志如下所示:
[INFO] ------------------------------------------------------------------------
[INFO] Parsing Liquibase Properties File
[INFO] File: src/main/resources/liquibase.properties
[INFO] 'outputChangeLogFile' in properties file is not being used by this task.
[INFO] ------------------------------------------------------------------------
[INFO] Executing on Database: jdbc:postgresql://localhost:5432/applied
INFO 20.02.19 21:19: liquibase-hibernate: Reading hibernate configuration hibernate:spring:com.victus.applied.entity?dialect=org.hibernate.dialect.PostgreSQLDialect
INFO 20.02.19 21:19: liquibase-hibernate: Found package com.victus.applied.entity
INFO 20.02.19 21:19: liquibase-hibernate: Found dialect org.hibernate.dialect.PostgreSQLDialect
INFO 20.02.19 21:19: liquibase-hibernate: Found hibernate.enhanced_idfalse
lut 20, 2019 9:19:26 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
name: default
...]
lut 20, 2019 9:19:26 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.11.Final}
lut 20, 2019 9:19:26 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
lut 20, 2019 9:19:26 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
lut 20, 2019 9:19:27 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
lut 20, 2019 9:19:27 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
INFO 20.02.19 21:19: liquibase-hibernate: Using dialect org.hibernate.dialect.PostgreSQLDialect
[INFO] Performing Diff on database wiktordyngosz @ jdbc:postgresql://localhost:5432/applied (Default Schema: public)
INFO 20.02.19 21:19: liquibase: src/main/resources/liquibase-diff.xml exists, appending
[INFO] Differences written to Change Log File, src/main/resources/liquibase-diff.xml
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
根本原因可能是 Liquibase 插件在類路徑上找不到您編譯的類。
我發現您通過src/main/resources/...
引用您的日志文件很可疑。 當作為 Maven 構建的一部分執行 Liquibase 插件時,所有資源都應該直接在類路徑上可用,例如changelog-master.xml
(沒有相對路徑)。
編譯后嘗試將diff
目標作為 Maven 構建的一部分執行。 此 POM 配置將插件綁定到process-classes 階段:
<build>
<plugins>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.6.3</version>
<dependencies>
...
</dependencies>
<configuration>
<verbose>true</verbose>
</configuration>
<executions>
<execution>
<goals>
<goal>diff</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
</plugin>
要執行此操作,請運行mvn process-classes
或稍后的階段,如mvn test
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.