2

既存のHibernate/Springアプリケーションを新しいバージョンに更新/更新するにはどうすればよいですか?

ソースを変更するには、Tomcatでwarをオーバーライドします。Hibernateのpersistence.xmlでは、hibernate.hbm2ddl.auto = check-これはdb構造を更新せず、チェックするだけです。

私の問題はデータベースにあります。アプリの2番目のバージョンでは、はるかに異なるエンティティ/テーブル構造を取得しました。

既存の構造とデータを別の構造とデータにアップグレードするにはどうすればよいですか?SQLスクリプトを作成し、データベースで直接実行しますか?

java / hibernateでテーブルをアップグレードする方法はありますか?

ありがとう

4

3 に答える 3

1

https://stackoverflow.com/a/1689769/106261

検証:スキーマを検証し、データベースに変更を加えません。

update:スキーマを更新します。

create:スキーマを作成し、以前のデータを破棄します。

create-drop:セッションの終了時にスキーマをドロップします。

于 2012-04-25T10:09:19.967 に答える
1

Hibernate を使用する場合、更新または作成で hbm2ddl セットを利用できますが、Hibernate は必要に応じてデータベースを更新できないため、これは実際には適していませ。たとえば、列を追加できますが、削除や名前変更はできないため、かなり制限されており、実際には、アプリケーションの新しいバージョンを発行するときに、より洗練されたケースが必要になるでしょう。

正しく行うには、 flyway や liquibase などのデータベース移行用の特別なツールを使用する必要あります。これらのツールからいくつかのクラスを初期化し、SQL スクリプトの場所を指定するには、Spring Bean をセットアップする必要があります。これらの SQL ファイルを選択し、まだそこにないものでデータベースを更新します (したがって、同じものを再書き込みしません)。スクリプトを 2 回)。

于 2012-04-25T10:28:56.467 に答える
0

あるいは、flyway や liquibase などの別のツールを使用したくない場合 (これらは優れたツールです)、hibernate.hbm2ddl.auto=update次のコードを使用して、 Hibernate が適用するスクリプトを手動で生成できます。

LocalSessionFactoryBuilder sessionFactory = new LocalSessionFactoryBuilder(dataSource);
sessionFactory.scanPackages("your.package.containing.entities");
Dialect dialect = new MySQL5Dialect(); // select your dialect
DatabaseMetadata metadata = new DatabaseMetadata(dataSource.getConnection(), dialect, sessionFactory);
List<SchemaUpdateScript> scripts = sessionFactory.generateSchemaUpdateScriptList(dialect, metadata);

Formatter formatter = FormatStyle.DDL.getFormatter();
for (SchemaUpdateScript script : scripts) {
   System.err.println(formatter.format(script.getScript()) + ";");
}

幸運を!

于 2016-03-20T13:33:44.667 に答える