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(";");
    }
}
È stato utile?

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 :-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top