克隆一个表的定义与Hibernate(就是hbm2ddl)
-
11-09-2019 - |
题
在我的休眠应用有注解驱动体: 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脚本。
正如我所说,可能不值得在此情况下:-)