【问题标题】:liquibase with PostgreSQL relation issue具有 PostgreSQL 关系问题的 liquibase
【发布时间】:2014-10-30 18:57:34
【问题描述】:

我正在使用 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)

我不明白为什么找不到“subscription_package”关系。我认为这是外键,但在我的第二个变更集上添加了一个明确的创建。表是在数据库中创建的,所以我认为映射是正确的,我只是看不出是什么导致了这个特定的问题。

更新 我已经确认正在创建数据库表并且在 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 的引用,是我的存储库变得混乱了。

无论如何,我将关闭它并提出不同的问题,因为我很确定这不再是一个 liquibase 问题。

关闭

【问题讨论】:

标签: postgresql spring-boot liquibase


【解决方案1】:

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

有一个类似的案例here

【讨论】:

  • 感谢您的快速回复。我的 application.properties 中有以下内容:spring.datasource.url=jdbc:postgresql://localhost:5432/myschema 表和序列已创建这一事实表明已找到。
  • 您是否应该明确告诉您将使用 subscription_package 表?我在配置中看不到对它的直接引用。
  • 我认为@Entity 会告诉 Hibernate 它应该使用名为“SubscriptionPackage”的表,因为那是类名。我尝试添加 @Table(name = "SubscriptionPackage") 来强制这样做,但我仍然得到同样的错误。
  • 也许您可以手动创建数据库并尝试它是否可以正常工作。通过这样做我们可以理解问题来自自动创建部分
猜你喜欢
  • 2021-12-30
  • 2021-05-23
  • 2017-11-28
  • 2013-02-08
  • 2019-06-16
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多