在我的休眠应用有注解驱动体: AuditEvent 。它非常简单,并没有外键关系。我通过将它们移动到另一个表 OldAuditEvent ,这是 AuditEvent 表的克隆归档在该表的旧条目。

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

我要自动生成过程中,有没有办法告诉hbb2ddl:“哎借此实体,更改表名称X和再生它的DDL”

<强>更新: 我通过你介绍的方法来得到这个工作。唯一的麻烦是在AnnotationSessionFactoryBean得到,因为它是一个工厂类和春季只会给你的工厂的产量。我创建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

可以再生成通过generateSchemaCreationScript()对象的generateSchemaUpdateScript()Configuration方法DDL脚本。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top