【问题标题】:Liquibase diff generate wrong primary keysLiquibase diff 生成错误的主键
【发布时间】:2019-02-08 00:50:12
【问题描述】:

当我使用 liquibase 在具有 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 的实体上生成变更集时遇到问题

pom.xml

<plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>3.6.2</version>
            <configuration>
                <!--<propertyFile>src/main/resources/liquibase.properties</propertyFile>-->
                <username>synchroad_adm</username>
                <password>changeme</password>
                <url>jdbc:postgresql://localhost:5432/synchroad?currentSchema=synchroad_adm</url>
                <referenceDefaultSchemaName>synchroad_adm</referenceDefaultSchemaName>
                <defaultSchemaName>synchroad_adm</defaultSchemaName>
                <referenceUrl>hibernate:spring:com.demo?dialect=org.hibernate.dialect.PostgreSQLDialect</referenceUrl>
                <driver>org.postgresql.Driver</driver>
                <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                <changeLogFile>${project.basedir}/src/main/resources/db/liquibase/app/db.changelog.xml</changeLogFile>
                <diffChangeLogFile>target/changelog-diff.xml</diffChangeLogFile>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.liquibase.ext</groupId>
                    <artifactId>liquibase-hibernate5</artifactId>
                    <version>3.6</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-data-jpa</artifactId>
                    <version>2.0.4.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-beans</artifactId>
                    <version>${spring.version}</version>
                </dependency>
                <dependency>
                    <groupId>javax.validation</groupId>
                    <artifactId>validation-api</artifactId>
                    <version>2.0.1.Final</version>
                </dependency>
                <dependency>
                    <groupId>org.javassist</groupId>
                    <artifactId>javassist</artifactId>
                    <version>3.23.1-GA</version>
                </dependency>
            </dependencies>
        </plugin>

类 java

@Getter
@Setter
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class MyTable {

    @Id
    @TableGenerator(name = "agent_generator", table = "agent_ids", pkColumnName = "seq_id", valueColumnName = "seq_value")
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "agent_generator")
    @Column(name = "id")
    private Long id;
}

@Entity
@Table(name = "table_one")
public class TableOne extends MyTable {

}

@Entity
@Table(name = "table_two")
public class TableTwo extends MyTable {

}

我正在使用 Liquibase 生成我的变更集。

mvn clean install liquibase:diff 

但 Liquibase 生成 2 个具有相同 primaryKeyName 的 createTable

diff.xml

<changeSet author="mvallet (generated)" id="1535684993363-2">
  <createTable tableName="table_one">
    <column name="id" type="BIGINT">
      <constraints primaryKey="true" primaryKeyName="MyTablePK"/>
    </column>
  </createTable>
</changeSet>
<changeSet author="mvallet (generated)" id="1535684993363-2">
  <createTable tableName="table_two">
    <column name="id" type="BIGINT">
      <constraints primaryKey="true" primaryKeyName="MyTablePK"/>
    </column>
  </createTable>
</changeSet>

所以当我启动时

mvn clean install liquibase:update

我有一个错误错误:错误:关系“MyTablePK”已经存在。

如果我不使用 liquibase 但我让休眠来生成表,我没有问题。

有人有想法吗?谢谢

【问题讨论】:

    标签: java maven spring-boot liquibase


    【解决方案1】:

    尝试从 MyTable 类中删除 @Entity 如果您使用的是休眠,那么生成的 PKN 是什么? 为什么需要持久化 MyTable?

    【讨论】:

    • MyTAble 没有持久化,只有 TableOne & TableTwo 如果删除 @Entity 我不使用 MyTableRepository extends JpaRepository
    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多