2012-09-01 13 views
5

私は現在更新中のプロジェクトをたくさん使っています。このプロジェクトをインストールできる場所はいくつかありますが、将来どのバージョンが使用されているのか、どのバージョンが更新されるのかは不明です。今のところ彼らはすべて同じです。クラスからHSQL作成テーブルクエリを作成

私の問題は、休止状態のエンティティクラスに多くの変更があり、データベースの内容が失われることなく、新しいバージョンに更新するのは簡単でなければならないという事実に由来します。 WARを置き換えて起動すると、それ自体が移行されます。

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

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

これは、いくつかの列を追加するために、いくつかのハードコードされたALTER TABLEをやってずっと面倒ではありませんが、それは完全に新しいテーブルを追加することに来るとき、それはすべてのことを書くために持っている愚かな感じ...だから私

質問(複数可)このです:

  • はどこか コードを休止状態、およびテーブルを作成するための有効なSQLクエリを取り戻すためにエンティティクラスと方言を送信する方法はありますか?

  • また、テーブルに列を追加するためのSQL文字列をdialect-safeで作成することもできます。

たぶん、あなたは別のアプローチを試してみてください

答えて

2

にアップグレード方法を持っています。 Hibernateは空のデータベースを作成するためにhibernate設定から必要なDDLステートメントを生成するためにhbm2ddlツール(antタスクまたはmavenプラグインとして利用可能)を持っていますが、2つの間で自動的に "diff"を実行できるツールは認識していませんバージョン。いずれにしても、既存のエンティティなどの新しいプロパティに適切なデフォルトを選択できるだけの十分にオブジェクトモデルを知っているだけであるため、手作業で慎重に行う方がよいでしょう。

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

+1

さて、私はこれがより良い答えであることを決めました。 Spring + Hibernate + Annotationsの依存関係やフィッティングとして自分自身をliquibaseしようとしていますが、独自のカスタムソリューションに使用できるハードコードされたSQLクエリを作成するのは素晴らしい仕事でした。ありがとう。 – Stmated

+1

Dipeshからこの回答を確認してください:http://stackoverflow.com/a/12259980/433789 – sdouglass

+1

Hibernateに自動更新を行わせると、新しいnull可能な列を追加するなどの単純なケースではうまくいきますが、より複雑なものに対処できません既存の列の値に基づいて値を計算する必要がある新しい列を追加することを想像してみてください。 )。 –

2

...私は、これはばかげた質問ではありません願って、それはHibernateに来るとき、私は何かを明らかに見逃していません。実行時の更新時にスキーマを生成する代わりに、手作業で作成します(ただし、Hibernateで生成されたスクリプトに基づくこともできます)。

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

可能性のあるすべてのデータベースの更新を実行し、結果のデータベースの整合性をチェックするユニット/統合テストを行うことができます。

私が構築したアプリケーションにはこの方法を使用しましたが、完璧に動作します。このパターンの実装の他の例はAndroidです。彼らは、私はあなたが完全にこれを自動化することができるでしょうとは思わない彼らのAPI

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

+1

私は受け入れ答えとしてこれを取るだろうと思います。残念なことに私は賞金を与えるのが奇妙だと思うのです。それは本当に私の質問に対する答えではないからです。私の質問が本当に不可能とみなされた場合には、私が計画していた解決策です。しかし、私は、それが追加の依存関係などを持たないという私自身のアイデアと最も一致するものだと思います。おかげで – Stmated

+1

真剣に、あなたはLiquibaseと特にその[冬眠のサポート](http://liquibase.org/manual/hibernate)をよく見てください。 –

+1

私はしました。私はドキュメンテーションを読むときにそれに対していくつかの留保をしましたが。ちょうど私が十分に徹底的に読んでいないし、私の環境とうまく混合する方法を考えていないかもしれないかもしれない。物事が変わった場合、改訂された承認を得て戻ってくるかもしれません。 – Stmated

4

は、あなたがそれがデータをすべてのデータベースを保持し、あなたがエンティティに変更されている列のみとテーブルを追加

hibernate.hbm2ddl.auto=update 

を試してみました。

+1

これは私が使用している、それは素晴らしい動作します。 – sdouglass

2

Hibernateのddlは使用しないでください。移行したい場合は、データを捨てます。私はあなたがLiquibaseを見てみることをお勧めします。 Liquibaseは、データベースのバージョン管理機能です。チェンジセットを使って動作します。各チェンジセットは手動で作成することも、LiquibaseにHibernateの設定を読み込ませてチェンジセットを生成させることもできます。

それはあなたのプロジェクトで右収まる必要がありますので、LiquiBaseを春から起動することができます;-)

関連する問題