liquibase与PostgreSQL关系问题

时间:2014-09-05 19:03:45

标签: postgresql spring-boot liquibase

我正在使用Liquibase为我的spring-boot项目创建数据库。当我尝试启动PostgreSQL时,我遇到了无法追踪的错误。我有以下实体:

@Entity
public class SubscriptionPackage {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long subscriptionPackageId;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "subscriptionPackage", fetch = FetchType.EAGER)
    private List<Menu> menus = new ArrayList<Menu>();

    @Enumerated(EnumType.STRING)
    @Column(name = "servicePackage", nullable = false)
    private ServicePackageType servicePackage;

    private String description;

@Entity
public class Menu {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long menuId;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "menu", fetch = FetchType.EAGER)
    private List<MenuItem> menuItems = new ArrayList<MenuItem>();

    @ManyToOne
    @JoinColumn(name = "subscriptionPackageId", nullable = false)
    private SubscriptionPackage subscriptionPackage;

    private String displayText;
    private int displayOrder;

然后在我的db.changelog-master.xml中我有:

<changeSet id="1" ..>
 <createTable tableName="SubscriptionPackage">
            <column name="subscriptionPackageId" type="bigint" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="servicePackage" type="varchar(300)"/>
            <column name="description" type="varchar(500)"/>
        </createTable>
..
      <createTable tableName="Menu">
            <column name="menuId" type="bigint" autoIncrement="true">
                <constraints primaryKey="true"/>
            </column>
            <column name="subscriptionPackageId" type="bigint"/>
            <column name="displayText" type="varchar(300)"/>
            <column name="displayOrder" type="int"/>
        </createTable>
</changeSet>

<changeSet id="2" ..>

        <addForeignKeyConstraint baseColumnNames="subscriptionPackageId"
                                 baseTableName="SubscriptionPackage"
                                 constraintName="fk_menu_subscriptionpackage"
                                 onDelete="CASCADE"
                                 onUpdate="RESTRICT"
                                 referencedColumnNames="menuId"
                                 referencedTableName="Menu"/>
</changeSet>

这是我得到的错误:

Caused by: org.postgresql.util.PSQLException: ERROR: relation "subscription_package" does not exist
  Position: 13
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187)

我不知道为什么我会收到&#34; subscription_package&#34;没有找到关系。我认为这是外键,但在我的第二个变更集上添加了一个明确的创建。这些表是在数据库中创建的,所以我认为映射是正确的,我只是不知道会导致这个特定问题的原因。

UPDATE 我已经确认正在创建数据库表并且Postgresql中存在外键约束:

CREATE TABLE "SubscriptionPackage"
(
  "subscriptionPackageId" bigserial NOT NULL,
  "servicePackage" character varying(300),
  description character varying(500),
  CONSTRAINT pk_subscriptionpackage PRIMARY KEY ("subscriptionPackageId"),
  CONSTRAINT fk_menu_subscriptionpackage FOREIGN KEY ("subscriptionPackageId")
      REFERENCES "Menu" ("menuId") MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE CASCADE
)

当我尝试保存没有与其关联的菜单的SubscriptionPackage列表时,我已经跟踪了在我的启动/种子中被抛出的异常。现在,我想知道我的SubscriptionPackage是否有一个Menu列表,而我的Menu有一个返回SubscriptionPackage的引用是我的存储库感到困惑。

无论如何,我要关闭这个和aska不同的问题,因为我很确定这不再是liquibase问题。

CLOSED

1 个答案:

答案 0 :(得分:0)

我认为您缺少将默认架构名称添加到spring hibernate配置中。

有一个类似的案例here