2014-09-05 3 views
0

Я использую 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, что мои репозитории путаются.

В любом случае, я собираюсь закрыть этот вопрос и задать другой вопрос, так как я уверен, что это уже не проблема ликбеза.

ЗАКРЫТО

+0

'' SubscriptionPackage' и "SubscriptionPackage" 'это два разных имени. См. Руководство http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS. Самый простой способ - * никогда не указывать имена объектов. –

ответ

0

Я думаю, что вам не хватает, чтобы добавить имя схемы по умолчанию конфигурации пружины гибернации.

Там же подобный случай here

+0

Благодарим вас за быстрый ответ. В моем приложении application.properties есть следующее: ** spring.datasource.url = jdbc: postgresql: // localhost: 5432/myschema ** И тот факт, что таблицы и последовательности созданы, указывает, что он найден. – sonoerin

+0

Не должны ли вы явно указывать, что будете использовать таблицу subscription_package? Я не вижу прямого обращения к нему в конфиге. –

+0

Я думаю, что @Entity сообщит Hibernate, что он должен использовать таблицу под именем «SubscriptionPackage», так как это имя класса. Я попытался добавить ** @ Table (name = "SubscriptionPackage") **, чтобы заставить это, но я все равно получаю ту же ошибку. – sonoerin