Pergunta

Na minha aplicação de hibernação há anotação objecto em funcionamento: AuditEvent . É muito simples e não tem relações de chave estrangeira. I arquivar as entradas antigas nesta tabela, movendo-os para outra mesa OldAuditEvent , que é um clone do AuditEvent mesa.

Agora nós gerar o DDL para toda a hbm2ddl aplicativo usando (em nosso datamodel anotada) e copiar manualmente / colar tabela de AuditEvent e mudar seu nome para criar OldAuditEvent .

Eu quero automatizar o processo de criação, existe alguma maneira de dizer hbb2ddl: "hey aproveitar esta entidade, mudar o nome da tabela para X e regenerá-lo de DDL"

Atualizar : Eu era capaz de começar este trabalho pela abordagem que você delineadas. O único problema foi ficando na AnnotationSessionFactoryBean uma vez que é um feijão de fábrica e na primavera só vai te dar a saída de sua fábrica. Eu criei ConfigExposingAnnotationSessionFactoryBean (estendendo AnnotationSessionFactoryBean) para expor a fábrica de feijão através de um estático -. Tipo de um hack, mas tudo que eu quero fazer é executar uma tarefa tempo de compilação

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(";");
    }
}
Foi útil?

Solução

É factível, mas um pouco confuso e, muito provavelmente, não vale a pena neste caso.

Você precisará alterar dinamicamente do Hibernate Configuração objeto antes SessionFactory é construído. I você está usando Spring, isso pode ser feito, substituindo método postProcessAnnotationConfiguration() de AnnotationSessionFactoryBean; caso contrário, você só precisa fazê-lo usando o seu objeto Configuration antes de chamar buildSessionFactory() nele.

Você pode ter acesso a mapeamentos de classe / table via configuration.getMappings(). então você terá que encontrar o seu mapeamento da tabela via getTable(), criar uma cópia com novo nome via addTable() e replicar todas as colunas / chaves via Tabela API .

Você pode, em seguida, gerar o script DDL via generateSchemaCreationScript() ou generateSchemaUpdateScript() métodos de objeto Configuration.

Como eu disse, provavelmente não vale a pena neste caso :-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top