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