Liquibase双向关系更改日志顺序

问题描述

在现有项目中实施liquibase时遇到了一个问题。因此,我们有两个实体:

公司

@Entity
@Table(name = "company")
@EqualsAndHashCode(of = {},callSuper = true)
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Company extends AbstractAccount {

    private String organizationName;
    private String mail;
    private Set<Stock> stocks;
    private Stock currentStock;

    @Column(name = "organization_name",unique = true)
    public String getorganizationName() {
        return organizationName;
    }

    @Email
    @Column(name = "mail",unique = true)
    public String getMail() {
        return mail;
    }

    @Cascade({CascadeType.REMOVE,CascadeType.SAVE_UPDATE})
    @OnetoMany(mappedBy = "company",fetch = FetchType.LAZY)
    public Set<Stock> getStocks() {
        return stocks;
    }

    @OnetoOne
    @JoinColumn(name = "current_stock_id",referencedColumnName = "id")
    public Stock getCurrentStock() {
        return currentStock;
    } 
}

库存

@Entity
@Table(name = "stock")
@EqualsAndHashCode(of = {},callSuper = true)
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Stock extends AbstractEntity {

    private String name;
    private Company company;
    private Double fare;

    @Column(name = "panel")
    public Double getfare() {
        return fare;
    }

    @NotBlank(message = "Название акции не может быть пустым.")
    @Column(name = "name")
    public String getName() {
        return name;
    }

    @Cascade({CascadeType.SAVE_UPDATE})
    @ManyToOne(fetch = FetchType.LAZY)
    public Company getCompany() {
        return company;
    }

}

还有我的liquibase更改日志。

公司

<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

<changeSet id="1" author="Maxim Grankin">
    <createTable tableName="company">
        <column name="id" type="bigint" autoIncrement="true">
            <constraints primaryKey="true" nullable="false"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="2" author="Maxim Grankin">
    <addColumn tableName="company">
        <column name="organizationName" type="varchar(255)">
            <constraints unique="true"/>
        </column>
        <column name="mail" type="varchar(255)">
            <constraints unique="true"/>
        </column>
        <column name="current_stock_id" type="bigint"/>
    </addColumn>
    <addForeignKeyConstraint baseTableName="company" baseColumnNames="current_stock_id"
                             constraintName="fkoi5aq2bm82091ubh15kfj29m1"
                             referencedTableName="stock"
                             referencedColumnNames="id"/>
</changeSet>

库存

<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

<changeSet id="1" author="Maxim Grankin">
    <createTable tableName="stock">
        <column name="id" type="bigint" autoIncrement="true">
            <constraints primaryKey="true" nullable="false"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="2" author="Maxim Grankin">
    <addColumn tableName="stock">
        <column name="name" type="varchar(255)"/>
        <column name="panel" type="double precision"/>
        <column name="company_id" type="bigint"/>
    </addColumn>
    <addForeignKeyConstraint baseTableName="stock" baseColumnNames="company_id"
                             constraintName="fk9r297vk0rghnrccw09x0qybfj"
                             referencedTableName="company"
                             referencedColumnNames="id"/>
</changeSet>

master

<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd
    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

<include file="data/changelogs/stock/stock/db.changelog.stock.xml"/>
<include file="data/changelogs/company/db.changelog.company.xml"/>

我有这个例外:

Caused by: org.postgresql.util.PsqlException: ERROR: relation "public.company" does not exist

我知道虽然没有公司表,但liquibase试图创建股票然后将company_id添加为外键。我有一堆双向关系,而这只是其中一部分。

问题:如何组织liquibase changeLog在一个版本中创建所有表及其之间的关系?我是否应该创建诸如“ db.changelogs.relations”之类的东西来设置外键?

UPD:关闭。使用maven插件为liquibase生成changeLogs

解决方法

需要在主更改日志文件中切换包含顺序。在执行db.changelog.stock.xml文件时尚未创建company表。

,

根据我对问题的评论创建答案:

您似乎正在手动编写变更日志xml。如果您安排更改日志以首先创建表和创建FK,则可以。

  • 创建Table1,Table2,Table3
  • Table1和Table2,Table2和Table3之间的设置关系

更好的选择是使用liquibase插件(针对您的Maven / Gradle)来生成此类更改日志。 Liquibase将首先为表生成更改日志,然后为FK生成更改日志,这样您就不必为此担心。

请参阅以下内容: