克隆一个表';使用Hibernate(hbm2ddl)的s定义

克隆一个表';使用Hibernate(hbm2ddl)的s定义,hibernate,annotations,ddl,hbm2ddl,Hibernate,Annotations,Ddl,Hbm2ddl,在我的hibernate应用程序中,有一个注释驱动的对象:AuditEvent。它非常简单,没有外键关系。我通过将旧条目移动到另一个表OldAuditEvent(AuditEvent表的克隆)来归档此表中的旧条目 现在,我们使用hbm2ddl(在带注释的数据模型上)为整个应用程序生成DDL,并手动复制/粘贴AuditEvent表并更改其名称以创建OldAuditEvent 我想自动化构建过程,有没有办法告诉hbb2ddl:“嘿,拿这个实体,把表名改成X,然后重新生成它的DDL?” 更新: 通过你

在我的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(";");
    }
}

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

在构建SessionFactory之前,您需要动态更改Hibernate的对象。如果您使用的是Spring,那么可以通过重写
AnnotationSessionFactoryBean
postProcessAnnotationConfiguration()
方法来实现;否则,在调用
buildSessionFactory()
对象之前,只需使用
Configuration
对象即可

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

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


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

我将尝试一下,看看它是否有效!即使是对于两个表,我也认为这是值得的——跨平台构建过程中的手动步骤只会拖累事情,并导致意外问题。祝您的实现好运。上面的方法对我很有用,不过我使用它的目的不同(运行时实体映射操作)。不过,我不得不说,我对DDL脚本中的Hibernate列重新排序非常恼火——我希望保持与源代码注释中相同的顺序。您是否以某种方式解决了这个问题?我们的开发过程是:带注释的POJO->DDL。我们总是使用hibernate属性名,所以我们不关心列的位置。如果hibernate随机重新排序,这意味着它可能在内部某处使用哈希集/映射。找到代码并将其切换到树集/映射,您可能会得到一致的顺序?*这会给您排序和一致的顺序,但不是您想要的。您需要在最后的过程中应用一种排序,扫描注释并根据类注释对内部hibernate结构进行重新排序。是的,我对常规属性这样做,这是一个巨大的痛苦:-)但对于关联,几乎不可能这样做(不重写hibernate元数据对象的重要部分)所以他们总是排在最后。我已经平静下来了:-)但是当我看到您正在从POJO注释生成DDL时,我想我应该检查一下您是否已经面对并解决了这个问题。