При попытке создать любую базу, вылазит данная ошибка
Ответы (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);


