hibernate.hbm2ddl.auto 控制 SessionFactory 建立時的資料庫結構同步行為,四種模式適用不同階段與場景。
四大模式對照
| 值 | 行為 | 資料保留 | 適用場景 | 風險 |
create | 啟動時 **Drop → Create** 所有表 | ❌ 全部清空 | 開發初期、單元測試 | 生產環境嚴禁,資料全失 |
create-drop | 啟動 Create,關閉 SessionFactory 時 Drop | ❌ 關閉時清空 | 整合測試、嵌入式資料庫 | 同 create,非持久化 |
update | 啟動時 **比對實體與表結構,僅新增/修改** | ✅ 保留現有資料 | 開發/測試/生產(謹慎) | 無法刪除欄位/表,DDL 鎖風險 |
validate | 啟動時 **僅比對,不修改** | ✅ 完全不動 | 生產環境推薦 | 結構不符啟動失敗 |
none | 完全不處理 | ✅ 完全不動 | 手動管理 DDL、遷移工具 | 無自動同步保障 |
配置範例
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
spring:
jpa:
hibernate:
ddl-auto: update # 或 validate
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
生產環境最佳實踐
- 預設使用
validate:啟動時檢測結構漂移,防止意外 DDL
- 引入遷移工具:Flyway / Liquibase 管理版本化 DDL 腳本
- 開發環境
update:快速迭代,配合 hibernate.show_sql=true 觀察 SQL
- 測試環境
create-drop:嵌入式 H2 整合測試,隔離乾淨
- 嚴禁生產
create/create-drop:資料清零災難
update 限制與風險
- ❌ 不支援 **刪除欄位/表/索引**
- ❌ 不支援 **重命名欄位/表**(視為 Drop+Create → 資料遺失)
- ❌ 不支援 **型別變更**(可能資料截斷/轉換失敗)
- ⚠️ 大表 DDL 可能長時間鎖表,影響線上服務
- ⚠️ 多實例並發啟動可能並發 DDL 衝突
對比:Hibernate vs 遷移工具
| 特性 | hbm2ddl.auto=update | Flyway/Liquibase |
| 版本控制 | 無 | ✅ SQL 腳本版本化 |
| 回滾支援 | 無 | ✅ 向下遷移 |
| 審計追蹤 | 無 | ✅ 執行歷史記錄 |
| 複雜遷移 | ❌ 僅結構同步 | ✅ 資料遷移、條件執行 |
| 團隊協作 | 衝突風險高 | ✅ 檢查和鎖機制 |