小编典典

使用Hibernate(hbm2ddl)复制表的定义

hibernate

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

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

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

更新
:我能够通过您概述的方法使此工作正常。唯一的麻烦是因为AnnotationSessionFactoryBean是工厂bean,而spring只会给您工厂的输出。我创建了ConfigExposedAnnotationSessionFactoryBean(扩展了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(";");
    }
}

阅读 309

收藏
2020-06-20

共1个答案

小编典典

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

在建立SessionFactory之前,您需要动态更改Hibernate的Configuration对象。如果您使用的是Spring,则可以通过覆盖;的postProcessAnnotationConfiguration()方法来完成AnnotationSessionFactoryBean;否则,您只需要Configuration在调用buildSessionFactory()该对象之前使用该对象即可。

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

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

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

2020-06-20