2011-08-16 11 views
4

新しいものが追加されますが、古いものは削除されません。Hibernate hbm2ddl.autoアップデートでmysqlのカラムが削除されない

私は古いものを言うとき、私は以前、彼らが存在していたと@column

で注釈さがに設定値を手動でCOLを落としたり、変更することが私の唯一のオプションは今完全に除去されているエンティティオブジェクトのプロパティを、意味create?どちらも特に魅力的ではありません。

他に何かありますか?

+0

私はドキュメントの中でずっと前から読んでいますが、列を追加しても決して削除しないことを思い出しています。 'create'は毎回データベースを空にするでしょうが、私が思い出しているものから更新するのではなく、データベースを初めて構築します。 'create-drop'を使う必要があります。また、データベースを作成するために 'update'を使用すると外部キーとインデックスが作成されないかもしれませんが、私はこれについては分かりません。 – Ali

答えて

11

どのような価値があるかについては、ライブ/プロダクションデータベースでhbm2ddl.autoを使用したことはありません。

はい、「更新」が参照されていない列を削除しない(おそらく、あなたが休止状態のアプリケーションで使用されていない列を持つ「レガシー」データベースを使用できるようにするために)外部アプリケーションによって使用される可能性があります)。ただし、特定の状況では、たとえば、エンティティ内のデータ型を変更した場合、hibernateは列を削除して再作成できます。これが、どの実動システムにも使用してはならない理由の1つです。

個人的には、厳密にローカルな/ dev環境以外のデータモデルの変更を処理するための自動化「ブラックボックス」フレームワークを信用することは決してありません。私は常にローカルの開発環境でそれを設定している、あなたは作成ドロップすることがあります。アプリケーションを中央テスト/ステージにプロモートしてからプロードすると、すべてのデータベースの変更は、古い旧式のDDLスクリプトを使用してDBAによって実行されます。データは、ハイバネート(または他のORM /自動化されたフレームワーク)における潜在的なバグや予期しない振る舞いを危険にさらすにはあまりにも貴重です。私は、アプリケーション内で設定されたデータベースユーザが、データベース内に作成/削除/変更権限を持っていないことを確認するだけで、休止状態での設定不良による災害を防ぐことさえできます。

質問に答えるために、あなたのエンティティを正確に反映するデータベースを常に維持するために休止状態にしたい場合は、 "create-drop"が唯一の選択肢です。ローカルのdevデータベース以外ではこれを使用しないでください。

+1

+1別個のデータユーザとデータ所有者です。 – beny23

1

私はあなたのデータベースと同期してデータベースを維持するためにliquibaseを調べます。たぶんちょっとした過労ですが、それに見合った価値があります。

+0

はいそれは残酷でもあり、悲しみ、悲しみ、狂気そしてついに狂気です – ismail

関連する問題