В моето приложение за хибернация има обект, управляван от анотации: AuditEvent. Той е много прост и няма връзки с външен ключ. Архивирам стари записи в тази таблица, като ги премествам в друга таблица OldAuditEvent, която е клонинг на таблицата AuditEvent.
В момента генерираме DDL за цялото приложение с помощта на hbm2ddl (на нашия анотиран модел на данни) и ръчно копираме/поставяме таблицата 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(";");
}
}