[英]Hibernate doesn't alter the existing column is that a drawback?
我有一個連接到 PostgreSQL 數據庫的 Spring Boot 應用程序。 DAO 層是使用Hibernate
和JPA
實現的,並且啟用了auto-ddl
,以便 hibernate 負責創建表
今天突然我的朋友讓我將列類型BigInteger
之一更改為String
,然后我說這是不可能的,因為該列已經填充了數據並且休眠不允許這樣做
現在他說這是 hibernate 的缺點,我們還就公司是否根據生產要求更改列定義進行了辯論?
題
您永遠不應該在生產中使用auto-ddl
。 它從未打算用於生產,而是用於開發。 您不應該使用它的原因是它可能會創建非最佳 DDL 或只會損壞您的數據。
在數據庫中進行更改的首選方法是創建一個文件夾,該文件夾將包含更改數據庫結構並將其存儲在版本控制中的所有 SQL 腳本。 通用名稱是migrations
。 然后,你可以手動在您的數據庫或使用工具,如運行這些腳本遷徙路線(我的建議),或liquibase 。
那么如何使用auto-ddl
呢? 例如,您可以為新實體創建一個表,然后使用用於創建它的 DDL,並在應用一些調整(如有必要)后將其存儲在遷移中。 您還可以使用來自hibernate.hbm2ddl.auto 的驗證來檢查您的數據庫是否與您的實體匹配。
最后回答你的問題:
auto-ddl
從未打算進行數據庫遷移。auto-ddl
類的實用程序更改他們的數據庫。 有人(DBA 或開發人員)准備遷移腳本,然后在發布時手動或通過遷移工具應用它。這不是 Hibernate 的缺點, auto-ddl
旨在從模型創建模式而不是更新它。 原因是,正如您自己發現的那樣,這很少是直截了當的,並且可能需要對數據進行一些“按摩”。
我不會說在生產系統中更改數據類型是一種常見的做法,但這肯定是一個有效的場景。在我的這些年里,我不得不這樣做幾次,盡管這通常是微不足道的事情增加varchar
的大小或從date
更改為datetime
。 從BigInteger
更改為String
似乎有點不尋常,我會質疑您是如何到達該位置的,這可能表明設計存在問題。
無論哪種方式,解決方案是更改數據庫中的數據類型,這應該不是問題,然后更改Hibernate
映射以反映此更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.