Я использую Liquibase для создания моей базы данных для моего проекта загрузки весны. Когда я пытаюсь запустить Postgresql, я получаю ошибки, которые я не могу отслеживать. У меня есть следующие объекты:Liquibase with posgresql relation issue
@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)
Я не понимаю, почему я получаю "sub scription_package "не найден. Я думал, что это внешний ключ, но добавил явное создание на моем втором наборе изменений. Таблицы создаются в базе данных, поэтому я считаю, что отображение правильное, я просто не вижу, что может вызвать эту проблему.
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 список меню, а в моем меню есть ссылка обратно на SubscriptionPackage, что мои репозитории путаются.
В любом случае, я собираюсь закрыть этот вопрос и задать другой вопрос, так как я уверен, что это уже не проблема ликбеза.
ЗАКРЫТО
'' SubscriptionPackage' и "SubscriptionPackage" 'это два разных имени. См. Руководство http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS. Самый простой способ - * никогда не указывать имена объектов. –