hibernate и mysql с опцией create-drop, вывод консоли показывает ошибку ... но ddl выполнен нормально; возможный баг? - PullRequest
10 голосов
/ 03 января 2012

Я использую опцию create-drop для разработки, при развертывании в базе данных MySQL (используя hibernate 4) я получаю следующий вывод:

15:18:07,715 ERROR SchemaExport:426 - HHH000389: Unsuccessful: alter table my_table drop foreign key FKD42DEFE312AC02F1
15:18:07,715 ERROR SchemaExport:427 - Table 'my_db.my_table' doesn't exist

Кажется, он пытается изменить таблицу до того, как он ее создал. Стол и FK успешно созданы. Что вызывает сообщение об ошибке?

Ответы [ 3 ]

4 голосов
/ 03 января 2012

Проблема в том, что:

  • , если у вас есть две таблицы A и B и ссылка внешнего ключа в A, которая ссылается на B.
  • , и вы хотите удалить таблицы

Сначала необходимо удалить ограничение внешнего ключа.(за исключением того, что вы знаете правильную последовательность и не имеете циклических зависимостей)

Таким образом, вы обычно сначала удаляете все ограничения, а затем отбрасываете таблицы.

Если одна таблица не существует (поскольку она новая)тогда вы используете drop table if exists Но, к сожалению, my-sql как оператор не удаляет forainkey, только если таблица существует.Так что это скорее недостаток возможностей, чем ошибка.


Я решил это, но мои настройки отличаются.Я использую hibernate только в режиме проверки и запускаю сценарии для обновления базы данных вручную.Сценарии создаются hibernate org.hibernate.tool.hbm2ddl.SchemaExport.Затем я беру сгенерированный файл, добавив set foreign_key_checks = 0; в начале и set foreign_key_checks = 1; в конце.Затем я прокомментировал (добавьте -- в начале) каждую строку, которая соответствует шаблону alter table *. drop foreign key *.;

@ См. https://stackoverflow.com/a/34038447/280244 для получения более подробной информации

0 голосов
/ 08 мая 2015

Проверьте также ответ на этот похожий вопрос: Ошибки Grails 2.4 и hibernate4 с run-app

Для меня это показалось так:

Это просто регистрация ошибки, потому что таблица, которую она пытается отбросить, еще не существует.

0 голосов
/ 18 июля 2013

Когда я делал это, я использовал postgres в качестве базы данных, и это легко исправить.Что происходит, так это то, что эти таблицы воссоздаются каждый раз, и все, что было в этих таблицах раньше, стирается.Чтобы исправить это, перейдите в ваш файл persistence.xml в каталоге src / main / resources / META-INF там, в файле persistence.xml, закомментируйте строку, которая

<property name="hibernate.hbm2ddl.auto" value="create"/>

Эта строка воссоздает всетаблицы с одним и тем же внешним ключом каждый раз, которые будут отбрасывать и заново создавать все ваши таблицы (все ваши данные в базе данных будут потеряны) каждый раз, когда вы перезапускаете сервер tomcat / jetty.Если вы закомментируете это, он не сможет воссоздать базу данных, а данные там останутся.

http://static.springsource.org/spring-roo/reference/html/base-persistence.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...