web-dev-qa-db-ja.com

Hibernateでデータを失うことなくデータベーススキーマを更新するにはどうすればよいですか?

HibernateとJBossを使用してJava EEアプリを開発していると想像してください。いくつかの重要なデータを含む実行中のサーバーがあります。アプリの次のバージョンをときどきリリースします(1- 2週間)そして、永続層にたくさんの変更があります:

  • 新しいエンティティ
  • 削除されたエンティティ
  • 属性タイプの変更
  • 属性名の変更
  • 関係の変化

データベーススキーマを更新してデータを保持するシステムを効果的にセットアップするにはどうすればよいですか?私の知る限り(私は誤解しているかもしれませんが)、Hibernateは列の変更、制約の削除/変更を実行しません。

ありがとう、アルテムB。

25
artemb

LiquiBase が最善の策です。 hibernate統合 モードがあり、Hibernateのhbm2ddlを使用してデータベースとhibernateマッピングを比較しますが、データベースを自動的に更新するのではなく、実際に実行する前に検査できるliquibase変更ログファイルを出力します。

より便利ですが、データベースと休止状態のマッピングを比較するツールは間違いを犯します。例については、 http://www.liquibase.org/2007/06/the-problem-with-database-diffs.html を参照してください。 liquibaseを使用すると、分岐やマージを伴うコードに耐えられる形式で開発するときに、データベースの変更のリストを作成できます。

17
Nathan Voxland

https://github.com/Devskiller/jpa2ddl ツールを使用できます。このツールはMavenおよびGradleプラグインを提供し、JPAエンティティに基づいて Flyway の自動スキーマ移行を生成できます。また、すべてのプロパティ、方言、ユーザータイプ、命名戦略なども含まれます。

4
Jakub Kubrynski

私は個人的に、移行SQLスクリプトのすべての変更を追跡しています。

3
Maurice Perry
3

1つのアプリでは、Hibernateに組み込まれているSchemaUpdateをbootstrapクラスから直接使用するため、アプリが起動するたびにスキーマがチェックされます。これにより、新しい列またはテーブルの追加が処理されます。ほとんどの場合、成熟したアプリで発生します。列の削除などの特殊なケースを処理するために、bootstrapはtry/catchでddlを手動で実行するだけなので、すでに一度削除されている場合は、サイレントに実行されます。エラーが発生します。本番アプリのミッションクリティカルなデータでこれを行うかどうかはわかりませんが、数年と数百回のデプロイで問題が発生したことはありません。

2
Brian Deterling

Nathan Voxlandが LiquiBase について言ったことのさらなる応答として、mySqlデータベースのWindowsでの移行を実行する例を次に示します。

たとえば、mysqlconnectorをliquibaseディストリビューションのlibフォルダーの下に配置します。

Liquibaseディストリビューションのルートにファイルプロパティliquibase.propertiesを作成し、次の繰り返し行を挿入します。

driver: com.mysql.jdbc.Driver
classpath: lib\\mysql-connector-Java-5.1.30.jar
url: jdbc:mysql://localhost:3306/OLDdatabase
username: root
password: pwd

たとえば、NEWdatabaseなど、別の名前で更新されたデータベースを生成または取得します。

ここで、次のコマンドラインを使用してファイルMigration.xmlの違いを抽出します。

liquibase diffChangeLog --referenceUrl="jdbc:mysql://localhost:3306/NEWdatabase" 
--referenceUsername=root --referencePassword=pwd > C:\Users\ME\Desktop\Migration.xml

最後に、生成されたばかりのMigration.xmlファイルを使用して更新を実行します。

Java -jar liquibase.jar --changeLogFile="C:\Users\ME\Desktop\Migration.xml" update

注意:このコマンドラインはすべて、liquibase.bat /.shとliquibase.jarが存在するliquibaseホームディレクトリから実行する必要があります。

2
Jad B.

DBMigrateを使用することもできます。 Liquibaseに似ています:

Ruby on Railsの「rakemigrate」と同様に、このライブラリを使用すると、Javaアプリケーションのデータベースアップグレードを管理できます。

1
Hendy Irawan

Hbm2ddlantタスクを使用してddlを生成します。データベース内のテーブル/列の変更を実行するオプションがあります。

Hbm2ddlantタスクの「update」属性を参照してください。

http://www.hibernate.org/hib_docs/tools/reference/en/html/ant.html#d0e1137

update(デフォルト:false):データベースにあるものとマッピングが指定するものとの間の「デルタ」を表す更新スクリプトを作成してみてください。作成/更新属性を無視します。 (本番データベースに対してnotを使用しないでください。適切なデルタを生成できることや、基盤となるデータベースが実際に必要な操作を実行できることを保証するものではありません)

1
Matt Sidesinger