2

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

現在、hbm2ddl(注釈付きデータモデル上)を使用してアプリケーション全体のDDLを生成し、AuditEventテーブルを手動でコピーして貼り付け、名前を変更してOldAuditEventを作成します。

ビルドプロセスを自動化したいのですが、hbb2ddlに「このエンティティを取得し、テーブル名をXに変更して、DDLを再生成する」ように指示する方法はありますか?

更新:あなたが概説したアプローチによってこれを機能させることができました。唯一の問題は、AnnotationSessionFactoryBeanを取得することでした。これは、ファクトリBeanであり、Springはファクトリの出力のみを提供するためです。ConfigExposedAnnotationSessionFactoryBean(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(";");
    }
}
4

1 に答える 1

2

それは実行可能ですが、かなり厄介であり、おそらくこの場合は価値がありません。

SessionFactoryをビルドする前に、 HibernateのConfigurationオブジェクトを動的に変更する必要があります。Springを使用している場合、これは;postProcessAnnotationConfiguration()のメソッドをオーバーライドすることで実行できます。それ以外の場合は、オブジェクトを呼び出す前にAnnotationSessionFactoryBean、オブジェクトを使用してそれを行う必要があります。ConfigurationbuildSessionFactory()

を介してクラス/テーブルマッピングにアクセスできますconfiguration.getMappings()。次に、を介してテーブルマッピングを検索しgetTable()、を介して新しい名前でコピーを作成し、TableAPIを介しaddTable()すべての列/キーを複製する必要があります。

generateSchemaCreationScript()次に、オブジェクトのメソッドまたはgenerateSchemaUpdateScript()メソッドを介してDDLスクリプトを生成できConfigurationます。

私が言ったように、この場合はおそらく価値がありません:-)

于 2009-08-06T18:02:49.110 に答える