2015-10-13 199 views
0

我們的架構是由Hibernate映射正在演變隨着時間的推移,我們正在使用的飛行路線不同版本之間遷移;它的效果很好。然後,我們會在我們的CI構建管道中自動對數據庫的副本進行遷移,然後啓動hibernate以驗證我們的模型與我們的模式是否兼容,從而確保遷移在部署時可以正常工作。查找數據庫DDL映射字段

然而有一個問題,如果我們忘記刪除數據庫中的一個領域,但在模型中取出。如果該字段是NOT NULL字段或外鍵,問題會變得更糟。

因此,我想在啓動過程中建立一個檢查,驗證數據庫不包含任何休眠未知的字段。 Hibernates SchemaValidator檢查數據庫中沒有字段缺失,但不關心反斜槓。

任何想法,我可能會寫這個邏輯。我在想,我可能SchemaValidator得到的DDL,但似乎有很多缺陷照顧。

+0

當我在Google中進行依賴注入搜索時,我總是將關鍵字'自定義'。在這種情況下,「hibernate CustomSchemaValidator」即https://gist.github.com/jelies/8951881 – HRgiger

回答

0

1)生成從休眠(hbm2dd)到單獨的數據庫模式/用戶/所有者一個新的模式。我們將其命名爲HIBERNATE_SCHEMA

2)查詢原始之間的差異數據庫字典/元數據(我們將其命名爲ORIGINAL_SCHEMA)和休眠模式。例如,在Oracle:

select table_name, column_name from ALL_TAB_COLS 
where owner = 'ORIGINAL_SCHEMA' 
and (table_name, column_name) not in 
    (select table_name, column_name from ALL_TAB_COLS where owner = 'HIBERNATE_SCHEMA'); 

上述查詢的結果會給你的存在不中HIBERNATE_SCHEMA存在ORIGINAL_SCHEMA的所有列。

+0

聰明的方法。我不能這樣做,因爲DDL上的某些內容與休眠會產生的內容不一樣。例如外鍵名稱。更新模型可能是唯一的方法,但這將是一項相當艱鉅的任務,所以其他建議非常受歡迎:) – smox

+0

我還沒有能夠想出比您更好的解決方案 - 而且我已經意識到了一些有一個100%註釋模型的好的副作用。因此,我們將繼續註釋模型的其餘部分(主要指標和外鍵名稱必須設置)。 – smox