При попытке создать любую базу, вылазит данная ошибка

ошибка такая

пытаюсь создать таблицу для использования jdbc + h2, но не как не могу понять как создать ее введите сюда описание изображения

введите сюда описание изображения


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

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

Особенности работы с H2

Одной из особенностей H2 - является работа в режиме in-memory.

Данный режим практически ничего не требует указывать в свойствах подключения и крайне прост в настройке и по этой причине он чаще всего используется при запуске новичками(и далеко не всегда это делается осознанно).

При запуске H2 в in-memory режиме база данных хранится в оперативной памяти.
И как следует из вышесказанного весь жизненный цикл жизни данной БД, как правило, умещается в один запуск (если не указано обратного). Т.е. база данных создается при запуске приложения и удаляется целиком и полностью по его завершению.
Отсюда следует, что создавать и инициализировать все таблицы приложение должно самостоятельно при каждом запуске.

Как правило это используется при автоматизированном тестировании, когда вам нужно многократно восстанавливать одно и тоже состояние БД.

Поэтому вообще не факт, что та база данных которую вы видите в консоле IDE и та база данных, которую видит ваше Java-приложение - это одно и тоже.
Поэтому в данном случае создавать в консоле таблицы и ждать, что их увидит ваше Java-приложение бессмысленно.

Другие режимы работы H2

Стоит отметить что in-memory не является единственным режимом работы с БД H2.
В Вашем случае для простоты можно попробовать воспользоваться embedded-режимом, при котором данные хранятся не в оперативной памяти, а в файле.

Для корректной работы данной базы данных архиважно правильно указать подключение:

на диске в домашней папке:

jdbc:h2:~/dbname

на диске в указанном каталоге

jdbc:h2:./path/to/database

или

jdbc:h2:file:/path/to/database

в памяти

jdbc:h2:mem:dbname

Важно:
В IDE укажите ту же строку подключения, что и в Java-коде.
Желательно ссылаться на конкретный файл, к которому будет доступ и IDE и у приложения.

Ошибка при добавлении внешнего ключа

Ошибка происходит в момент выполнения следующего выражения:

alter table Ingredient_Ref
    add foreign key (ingredient) references Ingredient(id);

В ошибке сказано:

[90057][90057] Ограничение "PRIMARY KEY | UNIQUE (ID)" не найдено
Constraint "PRIMARY KEY | UNIQUE (ID)" not found

В ней H2 явно ругается на отсутствие ограничений(unique или primary key) в поле id (таблица Ingredient)

Другими словами: поле Ingredient_Ref.ingredient не может ссылаться на Ingredient и являться внешним ключом, поскольку поле id таблицы Ingredient НЕ ГАРАНТИРУЕТ нахождение одной единственной строки, которую можно ассоциировать с указанным значением. т.е. в вашем случае в эту таблицу возможно вставить несколько строк со значением id=1 и H2 не сможет понять, какую именно строку вы имели в виду.

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

ALTER TABLE Ingredient ADD PRIMARY KEY(ID);

Перед тем как вы попытаетесь сделать это:

alter table Ingredient_Ref
    add foreign key (ingredient) references Ingredient(id);
→ Ссылка