在我的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(";");
}
}
答案 0 :(得分:2)
这是可行的,但相当混乱,而且很可能在这种情况下不值得。
在构建SessionFactory之前,您需要动态更改Hibernate的Configuration对象。我使用的是Spring,可以通过覆盖postProcessAnnotationConfiguration()
的{{1}}方法来完成;否则,您只需要在调用AnnotationSessionFactoryBean
之前使用Configuration
对象进行操作。
您可以通过buildSessionFactory()
访问类/表映射。然后,您需要通过configuration.getMappings()
找到您的表格映射,通过getTable()
创建一个新名称的副本,并通过Table API复制所有列/键。
然后,您可以通过addTable()
对象的generateSchemaCreationScript()
或generateSchemaUpdateScript()
方法生成DDL脚本。
正如我所说,在这种情况下可能不值得:-)