Проблема при создании таблиц в H2 In Memory при попытке создать двунаправленную связь

У меня есть три таблицы,которые создаются следующим образом:

CREATE TABLE restaurant_schema.dishes
(
    dish_id     BIGINT AUTO_INCREMENT PRIMARY KEY,
    name        VARCHAR(64)   NOT NULL,
    price       NUMERIC(7, 2) NOT NULL,
    weight      INT           NOT NULL,
    recipe_id   BIGINT REFERENCES warehouse_schema.recipes (id),
    description VARCHAR(256),
    category_id BIGINT REFERENCES restaurant_schema.categories (id)
);

CREATE TABLE delivery_schema.order_item
(
    id       LONG,
    order_id BIGINT REFERENCES delivery_schema.dish_orders (id),
    dish_id  BIGINT REFERENCES restaurant_schema.dishes (dish_id),
    quantity INTEGER NOT NULL
);

CREATE TABLE delivery_schema.dish_orders
(
    id            BIGINT AUTO_INCREMENT PRIMARY KEY,
    order_item_id BIGINT NOT NULL REFERENCES delivery_schema.order_item (id),
    order_time    TIMESTAMP NOT NULL
);

Когда я пытаюсь стартануть то получаю ошибку:

SQL State  : 42S02
Error Code : 42102
Message    : Таблица "dish_orders" не найдена

Очевидно что order_item пытается сослаться на dish_order,но такой таблицы еще не существует. Однако по моей бизнес логике мне необходима двунаправленная связь,как можно выйти из ситуации?

P.S Менять порядок создания таблиц пробовал


Ответы (1 шт):

Автор решения: Михаил Ребров

Все просто:

  1. Создай таблицу order_item БЕЗ поля(order_id) ссылающегося на несуществующую таблицу dish_orders.
  2. Создай недостающую таблицу dish_orders
  3. И после всего этого спокойно добавляй недостающее поле order_id, ссылающееся на уже существующую таблицу dish_orders

Таблицы у нас модифицируются с помощью ALTER TABLE

ALTER TABLE delivery_schema.order_item
    ADD COLUMN order_id BIGINT REFERENCES delivery_schema.dish_orders (id);

Все вместе выглядеть будет вот так:

CREATE TABLE restaurant_schema.dishes
(
    dish_id     BIGINT AUTO_INCREMENT PRIMARY KEY,
    name        VARCHAR(64)   NOT NULL,
    price       NUMERIC(7, 2) NOT NULL,
    weight      INT           NOT NULL,
    recipe_id   BIGINT REFERENCES warehouse_schema.recipes (id),
    description VARCHAR(256),
    category_id BIGINT REFERENCES restaurant_schema.categories (id)
);

CREATE TABLE delivery_schema.order_item
(
    id       LONG,
    dish_id  BIGINT REFERENCES restaurant_schema.dishes (dish_id),
    quantity INTEGER NOT NULL
);

CREATE TABLE delivery_schema.dish_orders
(
    id            BIGINT AUTO_INCREMENT PRIMARY KEY,
    order_item_id BIGINT NOT NULL REFERENCES delivery_schema.order_item (id),
    order_time    TIMESTAMP NOT NULL
);

ALTER TABLE delivery_schema.order_item
    ADD COLUMN order_id BIGINT REFERENCES delivery_schema.dish_orders (id);

Также есть второй вариант:

  1. Сначала создай нужные таблицы, но без внешних ключей.
  2. Потом на готовой структуре добавь внешние ключи
→ Ссылка