Clonar definição de uma tabela com hibernação (hbm2ddl)
-
11-09-2019 - |
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(";");
}
}
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 :-)