29

Hibernate と JBoss を使用して Java EE アプリを開発しているとします。いくつかの重要なデータを含む実行中のサーバーがあります。アプリの次のバージョンをときどき (1 ~ 2 週間) リリースすると、永続化レイヤーに多くの変更が加えられます。

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

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

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

4

8 に答える 8

17

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

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

于 2009-04-15T03:22:22.320 に答える
4

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

于 2009-04-10T15:57:13.903 に答える
2

http://liquibase.org/

于 2009-04-10T16:04:25.070 に答える
2

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

たとえば、mysqlコネクタを 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 ホーム ディレクトリから実行する必要があります。

于 2014-07-17T09:28:04.003 に答える
1

DBMigrateも使用できます。Liquibase に似ています:

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

于 2010-10-09T09:07:32.113 に答える
1

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

hbm2ddl ant タスクの「更新」属性を参照してください。

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

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

于 2009-04-11T01:25:11.713 に答える