使用Hibernate克隆表的定义(hbm2ddl)

时间:2009-08-06 14:55:15

标签: hibernate annotations ddl hbm2ddl

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

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

我想自动化构建过程,有没有办法告诉hbb2ddl:“嘿接受这个实体,将表名改为X并重新生成它的DDL”?

更新: 我能够通过您概述的方法实现这一目标。唯一的麻烦是获取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(";");
    }
}

1 个答案:

答案 0 :(得分:2)

这是可行的,但相当混乱,而且很可能在这种情况下不值得。

在构建SessionFactory之前,您需要动态更改Hibernate的Configuration对象。我使用的是Spring,可以通过覆盖postProcessAnnotationConfiguration()的{​​{1}}方法来完成;否则,您只需要在调用AnnotationSessionFactoryBean之前使用Configuration对象进行操作。

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

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

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