2009-08-06 37 views
2

在我的hibernate應用程序中有註釋驅動對象:AuditEvent。它非常簡單,沒有外鍵關係。我將這個表中的舊條目移動到另一個表OldAuditEvent,這是AuditEvent表的克隆。用Hibernate克隆表的定義(hbm2ddl)

現在我們生成DDL整個應用程序的使用就是hbm2ddl(在我們的數據模型註釋)和手動複製/粘貼AuditEvent表並更改其名稱以創建OldAuditEvent

我想自動化構建過程,有什麼辦法可以告訴hbb2ddl:「嘿,拿這個實體,將表名更改爲X並重新生成它的DDL」?

更新: 我可以通過您列出的方法獲得此功能。唯一的麻煩是AnnotationSessionFactoryBean,因爲它是一個工廠bean,spring只會給你工廠的輸出。我創建了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(";"); 
    } 
} 

回答

2

這是可行的,但相當混亂,最有可能的是,在這種情況下不值得。

在構建SessionFactory之前,您需要動態更改Hibernate的Configuration對象。我使用Spring,這可以通過覆蓋postProcessAnnotationConfiguration()方法AnnotationSessionFactoryBean來完成;否則你只需要在調用buildSessionFactory()之前使用你的對象Configuration

您可以通過configuration.getMappings()訪問類/表映射。然後,您需要通過getTable()找到您的表格映射,通過addTable()創建一個新名稱的副本,並通過Table API複製所有列/鍵。

您可以然後通過Configuration對象的generateSchemaCreationScript()generateSchemaUpdateScript()方法生成的DDL腳本。

正如我所說的,在這種情況下可能不值得:-)

+0

我會試試看看它是否有效!即使對於2個表格,我認爲這是值得的 - 跨平臺構建過程中的手動步驟只會拖動並導致意外問題。 – Justin 2009-08-06 21:36:43

+0

祝您好運。上述方法適用於我,儘管我將它用於不同的目的(運行時實體映射操作)。不過,我必須說,我很擔心Hibernate會在DDL腳本中對列重新排序 - 我想保持與源代碼註釋中相同的順序。你有沒有解決這個問題,或者這對你來說不是問題? – ChssPly76 2009-08-06 22:00:50

+0

我們的開發過程是:帶註釋的POJO - > DDL。我們總是通過hibernate屬性名稱,所以我們不關心列位置。如果hibernate隨機重新排序,這意味着它可能在內部使用HashSet/Map。找到代碼將其切換到TreeSet/Map,您可能會得到一致的排序? – Justin 2009-08-06 22:22:46