質問

私の休止状態アプリケーションには、アノテーション駆動型オブジェクトがあります。 監査イベント. 。非常にシンプルで、外部キー関係はありません。このテーブルの古いエントリを別のテーブルに移動してアーカイブします 古い監査イベント, のクローンです。 監査イベント テーブル。

現時点では、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 物体。

先ほども言いましたが、この場合はおそらく価値がありません :-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top