13
<property name="hibernate.hbm2ddl.auto">update</property>

データベーススキーマを作成できます。プロパティ、制約、キーなどが自動的に追加されます。しかし、データベーススキーマを更新するのはどうでしょうか。エンティティからいくつかのプロパティを削除しても、hibernateはそれを削除しません。または、いくつかの制約を変更しても、hibernateはすでに作成されている制約に触れません...

では、休止状態でデータベーススキーマを実際に更新する方法はありますか?

ありがとう。

4

5 に答える 5

8

データベースの列とテーブルの必要なドロップを作成し、データベースの更新用に生成されたSQLにこれらのドロップを追加する独自のツールを作成しました。ただし、SchemaUpdateの生成を機能させるには、いくつかの追加機能を追加する必要がありました。

  • null以外のプロパティのチェックを追加する必要がありました。これには、データに対してUPDATEステートメントを発行して、可能な場合はnullを排除し、デフォルト値の次のポイントに導くことが含まれます。
  • 列のデフォルト値のチェックを追加する必要がありました。デフォルトは、列とそのデータ型のnull可能性によって推測されます。プリミティブは常にゼロまたはfalseに初期化され、nullではない列挙型が最初の列挙値に初期化されますが、他のオブジェクトの場合、スクリプトは手動で変更する必要があります。
  • @Column(length)データベースの列の長さが異なる場合があるため、varchar列のサイズ変更のサポートも追加しました。

しかし、すべてをまとめると、この方法で完全なツールを作成することはできません。コードで列の名前が変更された場合はどうなるでしょうか。タイプが自動的に変換できない方法で変更された場合はどうなりますか(現在までブール値ですか?)。リファクタリング履歴にアクセスできない場合、変更を常に伝播できるとは限りません。

于 2011-01-09T15:24:30.017 に答える
5

現在、liquibaseを使用して、データベースに依存しない方法でデータベースの自動変更を行っています。Hibernateアノテーションから直接liquibaseコマンドを抽出することは可能かもしれませんが、そのようなツールは存在しないと思うので、おそらく自分で行う必要があります。

于 2011-01-06T15:06:55.167 に答える
5

いいえ、ありません。hbm2ddlは、スキーマの移行を完全に管理するためのものではありません。スキーマへの追加の変更にのみ使用し、その他の目的で(生成されたスクリプト)を手動で編集する場合に最適です。

于 2011-01-01T23:47:16.137 に答える
2

スキーマの変更を管理するのに役立つ可能性のあるいくつかのプロジェクト:

  • mybatis(SOWでタグ付けされた1049の質問)
  • Liquibase(SOWでタグ付けされた663の質問)
  • Flyway(SOWでタグ付けされた400の質問)

役立つと思われるもう1つのリソースは、Flyway Webサイトの機能比較です(他にも関連するプロジェクトが記載されています)。

于 2015-01-20T21:20:20.473 に答える
1

Hibernateは、Hibernateマッピングのセットをデータベーススキーマと同期できるSchemaUpdateと呼ばれるクラスを提供します

古い投稿ですが、それが良いかどうかコミュニティに知らせてください:)

于 2011-01-06T14:45:57.010 に答える