2

在我的休眠应用程序中有注释驱动对象:AuditEvent。它非常简单,没有外键关系。我通过将旧条目移动到另一个表OldAuditEvent来归档该表中的旧条目,该表是AuditEvent表 的克隆。

现在,我们使用 hbm2ddl(在我们的注释数据模型上)为整个应用程序生成 DDL,并手动复制/粘贴 AuditEvent 表并更改其名称以创建OldAuditEvent

我想自动化构建过程,有什么方法可以告诉 hbb2ddl:“嘿,拿这个实体,将表名更改为 X 并重新生成它的 DDL”?

更新:我能够通过您概述的方法来完成这项工作。唯一的麻烦在于 AnnotationSessionFactoryBean 因为它是一个工厂 bean,而 spring 只会给你它工厂的输出。我创建了 ConfigExposingAnnotationSessionFactoryBean(扩展 AnnotationSessionFactoryBean)以通过静态公开 bean 工厂——有点像 hack,但我想要做的就是运行构建时任务。

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;否则你只需要Configuration在调用它之前使用你的对象来buildSessionFactory()完成它。

您可以通过 访问类/表映射configuration.getMappings()。然后,您需要通过 找到您的表映射getTable(),使用新名称创建副本并通过Table APIaddTable()复制所有列/键。

然后,您可以通过对象的generateSchemaCreationScript()generateSchemaUpdateScript()方法生成 DDL 脚本Configuration

正如我所说,在这种情况下可能不值得:-)

于 2009-08-06T18:02:49.110 回答