Клонировать определение таблицы с помощью Hibernate (hbm2ddl) - PullRequest
2 голосов
/ 06 августа 2009

В моем приложении hibernate есть объект, управляемый аннотациями: AuditEvent . Это очень просто и не имеет отношения к внешнему ключу. Я архивирую старые записи в этой таблице, перемещая их в другую таблицу OldAuditEvent , которая является клоном таблицы AuditEvent .

Сейчас мы генерируем DDL для всего приложения, используя hbm2ddl (в нашей аннотированной модели данных), вручную копируем / вставляем таблицу 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(";");
    }
}

1 Ответ

2 голосов
/ 06 августа 2009

Это выполнимо, но довольно грязно и, скорее всего, в этом случае не стоит.

Вам нужно будет динамически изменить объект Configuration Hibernate перед созданием SessionFactory. Если вы используете Spring, это можно сделать, переопределив postProcessAnnotationConfiguration() метод AnnotationSessionFactoryBean; в противном случае вам просто нужно сделать это, используя объект Configuration, прежде чем вызывать buildSessionFactory() для него.

Вы можете получить доступ к отображению классов / таблиц через configuration.getMappings(). Затем вам нужно будет найти соответствие таблицы с помощью getTable(), создать копию с новым именем с помощью addTable() и реплицировать все столбцы / ключи с помощью Table API .

Затем вы можете сгенерировать сценарий DDL с помощью generateSchemaCreationScript() или generateSchemaUpdateScript() методов объекта Configuration.

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

...