Hibernate を使用してテーブル定義のクローンを作成する (hbm2ddl)
-
11-09-2019 - |
質問
私の休止状態アプリケーションには、アノテーション駆動型オブジェクトがあります。 監査イベント. 。非常にシンプルで、外部キー関係はありません。このテーブルの古いエントリを別のテーブルに移動してアーカイブします 古い監査イベント, のクローンです。 監査イベント テーブル。
現時点では、hbm2ddl (アノテーション付きデータモデル上) を使用してアプリケーション全体の DDL を生成し、AuditEvent テーブルを手動でコピー/ペーストし、その名前を変更して作成します。 古い監査イベント.
ビルドプロセスを自動化したいのですが、hbb2ddl に次のように伝える方法はありますか?「このエンティティを取得して、テーブル名を X に変更して、DDL を再生成してください。」
アップデート:あなたが概説したアプローチによってこれを機能させることができました。唯一の問題は、AnnotationSessionFactoryBean を取得することでした。これは、AnnotationSessionFactoryBean がファクトリ Bean であり、Spring はファクトリの出力のみを提供するためです。ConfigExposingAnnotationSessionFactoryBean (AnnotationSessionFactoryBean を拡張) を作成して、静的方法で Bean ファクトリを公開しました。一種のハックですが、私がやりたいのはビルド時のタスクを実行することだけです。
Configuration cfg = ConfigExposingAnnotationSessionFactoryBean.s_instance.getConfiguration();
PersistentClass pClass = cfg.getClassMapping("com.myco.LoginAttempt");
pClass.getTable().setName("ArchiveLoginAttempt");
Dialect dialect = Dialect.getDialect(ConfigExposingAnnotationSessionFactoryBean.s_instance.getHibernateProperties());
// only output create tables, not indexes or FK
for (String s : cfg.generateSchemaCreationScript( dialect )) {
if (s.contains("create table") && s.contains("Archive")) {
m_outstream.print(s);
m_outstream.println(";");
}
}
解決
これは実行可能ですが、やや面倒で、おそらくこの場合は価値がありません。
Hibernate の設定を動的に変更する必要があります。 構成 SessionFactory が構築される前のオブジェクト。Spring を使用している場合、これはオーバーライドすることで実行できます postProcessAnnotationConfiguration()
の方法 AnnotationSessionFactoryBean
;それ以外の場合は、を使用してそれを行う必要があります Configuration
呼び出す前のオブジェクト buildSessionFactory()
その上で。
クラス/テーブルマッピングへのアクセスは、次のようにして取得できます。 configuration.getMappings()
. 。次に、テーブルマッピングを見つける必要があります。 getTable()
, 、新しい名前でコピーを作成します。 addTable()
すべての列/キーをレプリケートします。 テーブルAPI.
その後、次のようにして DDL スクリプトを生成できます。 generateSchemaCreationScript()
または generateSchemaUpdateScript()
の方法 Configuration
物体。
先ほども言いましたが、この場合はおそらく価値がありません :-)