Clonare la definizione di una tabella con Hibernate (hbm2ddl)
-
11-09-2019 - |
Domanda
Nella mia applicazione Hibernate c'è annotazione oggetto guidato: AuditEvent . E 'molto semplice e non ci sono relazioni di chiave esterna. L'archiviazione di vecchie voci in questa tabella spostandoli in un'altra tabella OldAuditEvent , che è un clone del AuditEvent tavolo.
In questo momento generiamo il DDL per l'intera applicazione tramite hbm2ddl (sul nostro datamodel annotato) e copiare manualmente / incollare la tabella AuditEvent e cambiare il suo nome per creare OldAuditEvent .
Voglio automatizzare il processo di compilazione, c'è qualche modo per dire hbb2ddl:? "Hey prendere questa entità, cambiare il nome della tabella per X e rigenerare è DDL"
Aggiorna : Sono stato in grado di ottenere questo lavoro dall'approccio profilassi. L'unico problema è stato sempre al AnnotationSessionFactoryBean dal momento che è un fagiolo fabbrica e la primavera solo vi darà l'uscita della sua fabbrica. Ho creato ConfigExposingAnnotationSessionFactoryBean (che si estende AnnotationSessionFactoryBean) per esporre la fabbrica di fagioli attraverso una statica -. Sorta di un hack, ma tutto quello che voglio fare è eseguire un compito tempo di costruzione
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(";");
}
}
Soluzione
E 'fattibile, ma piuttosto disordinato e, molto probabilmente, non vale la pena in questo caso.
È necessario modificare dinamicamente oggetto prima SessionFactory è costruito. Mi stai usando primavera, questo può essere fatto ridefinendo il metodo postProcessAnnotationConfiguration()
di AnnotationSessionFactoryBean
; altrimenti avrete solo bisogno di farlo usando il vostro oggetto Configuration
prima di invocare buildSessionFactory()
su di esso.
È possibile ottenere l'accesso alle mappature classe / table tramite configuration.getMappings()
. Sarà quindi necessario trovare la mappatura tabella tramite getTable()
, creare una copia con il nuovo nome di via addTable()
e replicare tutte le colonne / chiavi tramite Tabella API .
È quindi possibile generare lo script DDL tramite generateSchemaCreationScript()
o generateSchemaUpdateScript()
metodi di oggetto Configuration
.
Come ho già detto, probabilmente non vale la pena in questo caso :-)