Создание внешних ключей с помощью спящего режима

Я столкнулся со следующей проблемой с Hibernate и внешними ключами:

Когда я впервые развернул свое веб-приложение, Hibernate был настроен с такими параметрами (среди многих других):

  • databasePlatform установлен на "общий" (не зависящий от движка) диалект org.hibernate.dialect.MySQLDialect.
  • hibernate.hbm2ddl.auto установить на update

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

Теперь, когда я хочу перенести все таблицы на InnoDB, я бы хотел, чтобы Hibernate автоматически создавал отсутствующие внешние ключи. К сожалению, похоже, что Hibernate просто ищет индекс:

  • Если индекс существует, Hibernate не создаст соответствующий внешний ключ;
  • Если я удалю индекс, Hibernate создаст и индекс, и внешний ключ.

Поскольку я не хочу удалять каждый индекс в своей схеме, знаете ли вы способ сказать Hibernate создать внешний ключ, даже если индекс создан?

Спасибо.


person ssssteffff    schedule 03.01.2013    source источник
comment
Нельзя ли просто заставить hbm2ddl воссоздать базу данных с нуля? Он не предназначен для использования в производственной среде, поэтому я не ожидаю, что Hibernate сможет это сделать, если он еще не обновлен.   -  person Tony Day    schedule 03.01.2013
comment
На самом деле я хотел бы легко преобразовать базу данных среды тестирования, чтобы сравнить и протестировать полученную базу данных. Если все работает нормально, а тест дает окончательные результаты, я определенно не буду использовать обновление hbm2ddl в своей производственной среде, а буду использовать соответствующий скрипт SQL, протестированный в моей тестовой среде.   -  person ssssteffff    schedule 03.01.2013


Ответы (1)


Мое предложение состояло бы в том, чтобы позволить hibernate воссоздать всю схему, поскольку это ваша база данных разработки.

Однако, если у вас есть много тестовых данных, которые вы не хотите терять, я бы создал скрипт, используя доступные команды MySQL, для автоматического удаления всех ваших индексов для Hibernate для их воссоздания. Команды, которые вам понадобятся:

show tables;

show index from `table_name`;

drop index `index_name` on `table_name`;

Организуйте их в какую-либо форму программного сценария (оболочка, python или приложение, которое вы создаете и т. д.), и все готово.

person Tony Day    schedule 03.01.2013