Hibernate hbm2ddl.auto обновление не удаляет столбцы с MySQL - PullRequest
5 голосов
/ 16 августа 2011

Он добавляет новые, но, насколько я вижу, он не удаляет старые?

Когда я говорю старые, я имею в виду свойства объектов сущностей, которые теперь полностью удалены, где ранее ониприсутствовали и помечены @column

Могу ли я только вручную сбросить col или изменить значение конфигурации на create?Ни один из которых не особенно очарователен.

Или что-то еще?

Ответы [ 2 ]

12 голосов
/ 16 августа 2011

Для чего бы то ни было, никогда НИКОГДА не используйте hbm2ddl.auto в любой действующей / производственной базе данных.

Да, «работает как задумано», что «обновление» не удаляет столбцы, на которые нет ссылок(возможно, чтобы позволить вам использовать «устаревшие» базы данных, в которых есть столбцы, которые не используются вашим приложением гибернации, но могут использоваться внешними приложениями).Однако в определенных обстоятельствах hibernate может отбрасывать и воссоздавать столбцы, если, например, вы измените тип данных в вашей сущности.Это одна из причин, по которой вы никогда не должны использовать ее для какой-либо производственной системы.

Лично я никогда бы не стал доверять автоматизированной структуре "черного ящика", которая обрабатывает изменения в модели данных в любых условиях, кроме строго локальных сред / dev.Я всегда настраивал его так, чтобы в локальных средах разработки вы могли делать create-drop.Как только пришло время начать продвижение вашего приложения в центральное тестирование / стадию и затем в prod, все изменения в базе данных делаются администратором базы данных с помощью старых добрых сценариев DDL.Данные слишком ценны, чтобы рисковать потенциальной ошибкой или неожиданным поведением в спящем режиме (или любой другой ORM / автоматизированной среде).Я даже проверяю, что пользователь базы данных, настроенный в моих приложениях, даже не имеет прав на создание / удаление / изменение в базе данных, просто чтобы предотвратить бедствия из-за неправильной конфигурации в спящем режиме.

Итак, чтобы ответить на вашвопрос - если вы хотите, чтобы hibernate всегда поддерживал вашу базу данных, точно отражающую ваши сущности, «create-drop» - ваш единственный вариант.Только никогда не используйте его ни на чем, кроме локальных баз данных разработчика.

1 голос
/ 16 августа 2011

Я бы посмотрел на liquibase , чтобы синхронизировать вашу базу данных с вашими объектами.Может быть, немного излишним, но оно того стоит.

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