Клонировать определение таблицы с помощью Hibernate (hbm2ddl)

StackOverflow https://stackoverflow.com/questions/1239450

Вопрос

В моем спящем приложении есть объект, управляемый аннотациями: АудитЕвент.Это очень просто и не имеет отношений с внешними ключами.Я архивирую старые записи в этой таблице, перемещая их в другую таблицу. 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 объект.

Как я уже сказал, в данном случае, наверное, оно того не стоит :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top