Клонировать определение таблицы с помощью Hibernate (hbm2ddl)
-
11-09-2019 - |
Вопрос
В моем спящем приложении есть объект, управляемый аннотациями: АудитЕвент.Это очень просто и не имеет отношений с внешними ключами.Я архивирую старые записи в этой таблице, перемещая их в другую таблицу. OldAuditEvent, который является клоном АудитЕвент стол.
Прямо сейчас мы генерируем DDL для всего приложения, используя hbm2ddl (в нашей аннотированной модели данных), вручную копируем/вставляем таблицу AuditEvent и меняем ее имя, чтобы создать OldAuditEvent.
Я хочу автоматизировать процесс сборки, есть ли способ сообщить hbb2ddl:«Эй, возьми эту сущность, измени имя таблицы на X и заново создай ее DDL»?
Обновлять:Мне удалось заставить это работать с помощью подхода, который вы изложили.Единственная проблема заключалась в том, чтобы добраться до AnnotationSessionFactoryBean, поскольку это фабричный компонент, и Spring предоставит вам только выходные данные его фабрики.Я создал ConfigExposeAnnotationSessionFactoryBean (расширяющий AnnotationSessionFactoryBean), чтобы раскрыть фабрику компонентов посредством статического хака, но все, что я хочу сделать, это запустить задачу времени сборки.
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.
Затем вы можете сгенерировать сценарий DDL через generateSchemaCreationScript()
или generateSchemaUpdateScript()
методы Configuration
объект.
Как я уже сказал, в данном случае, наверное, оно того не стоит :-)