在我的hibernate应用程序中,有注释驱动的对象: AuditEvent。它非常简单,没有外键关系。我通过将旧条目移到另一个表OldAuditEvent来存档这个表中的旧条目,它是AuditEvent表的一个克隆。
现在,我们使用hbm2ddl (在带注释的数据模型上)为整个应用程序生成DDL,并手动复制/粘贴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(";");
}
}发布于 2009-08-06 18:02:49
这是可行的,但相当混乱,很可能,在这种情况下,不值得这样做。
在构建Hibernate之前,您需要动态地更改Hibernate的配置对象。我使用的是Spring,这可以通过重写AnnotationSessionFactoryBean的AnnotationSessionFactoryBean方法来完成;否则,您只需要在调用Configuration对象之前使用Configuration对象来完成它。
您可以通过configuration.getMappings()访问类/表映射。然后,您需要通过getTable()找到表映射,通过addTable()创建一个具有新名称的副本,并通过表API复制所有列/键。
然后,您可以通过generateSchemaCreationScript()或Configuration对象的generateSchemaUpdateScript()方法生成DDL脚本。
正如我所说,在这种情况下可能不值得:-)
https://stackoverflow.com/questions/1239450
复制相似问题