5

私は現在更新に取り組んでいるよく使われるプロジェクトを持っています。このプロジェクトをインストールできる場所はいくつかありますが、将来、どのバージョンがどこでどのバージョンに更新されるかは定かではありません。しかし、今のところそれらはすべて同じです。

私の問題は、休止状態のエンティティクラスに多くの変更が加えられる可能性があるという事実に起因します。また、面倒なことなく、データベースコンテンツを失うことなく、新しいバージョンに簡単に更新できる必要があります。WARを置き換えて起動するだけで、自動的に移行されます。

私の知る限り、Hibernateはhibernate.hbm2ddl.auto = createでない限りテーブルを変更しませんが、実際にはすべてのデータを破棄しますか?

そのため、Springコンテキストが完全に読み込まれると、Beanが実行され、versionXからversionY(以前にデータベースに保存されていたバージョン)へのすべての変更を経て、データベースが現在のバージョンに移行され、手動で変更されます。テーブル。

いくつかの列を追加するためにハードコードされたALTERTABLEをいくつか実行するのはそれほど面倒ではありませんが、完全な新しいテーブルを追加することになると、それらすべてを記述しなければならないのはばかげています...

だから私の質問はこれです:

  • エンティティクラスと方言をどこかのHibernateコードに送信し、テーブルを作成するための有効なSQLクエリを取得する方法はありますか?

  • さらに良いことに、方言で安全な、テーブルに列を追加するためのSQL文字列をどうにかして作成しますか?

これがばかげた質問ではないことを願っています。Hibernateに関しては、明らかなことを見逃していません...

4

4 に答える 4

4

やってみました

hibernate.hbm2ddl.auto=update

データを含むすべてのデータベースを保持し、エンティティで変更した列とテーブルのみを追加します。

于 2012-09-04T08:56:18.190 に答える
2

たぶん、別のアプローチを試す必要があります。実行時の更新時にスキーマを生成する代わりに、「手動で」スキーマを作成します(ただし、休止状態で生成されたスクリプトに基づく場合もあります)。

データベースにバージョン番号を保存し、次のバージョンごとに更新スクリプトを作成します。ここで行う必要があるのは、データベースが現在どのバージョンであるかを判別し、必要な更新スクリプトを順番に実行して現在のバージョンにすることだけです。

それをさらに堅牢にするために、可能なすべてのデータベース更新を実行し、結果のデータベースの整合性をチェックするユニット/統合テストを行うことができます。

作成したアプリケーションにこのメソッドを使用しましたが、問題なく動作します。このパターンの実装の他の例はAndroidです。APIにアップグレードメソッドがあります

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onUpgrade(android.database.sqlite.SQLiteDatabase、int、int)

于 2012-09-04T08:12:45.200 に答える
2

これを完全に自動化できるとは思いません。Hibernateにはhbm2ddlツール(antタスクまたはmavenプラグインとして使用可能)があり、hibernate構成から必要なDDLステートメントを生成して空のデータベースを作成しますが、2つの間の自動「差分」を実行できるツールを認識していません。バージョン。いずれにせよ、既存のエンティティなどの新しいプロパティの正しいデフォルトを選択できるのに十分なオブジェクトモデルを知っているのはあなただけなので、手動で慎重に差分を行う方がおそらく良いでしょう。

差分を作成したら、liquibaseなどのツールを使用して差分を管理し、アプリケーションの開始時にデータベースへの更新の実際の適用を処理できます。

于 2012-09-04T08:34:14.773 に答える
2

Hibernateのddlを使用しないでください。移行する場合は、データが破棄されます。Liquibaseをご覧になることをお勧めします。Liquibaseはデータベースのバージョン管理です。チェンジセットを使用して動作します。各チェンジセットは手動で作成することも、LiquibaseにHibernate構成を読み取らせてチェンジセットを生成させることもできます。

LiquibaseはSpring経由で開始できるため、プロジェクトにぴったり合うはずです;-)

于 2012-09-04T09:09:44.897 に答える