Hibernate 核心優勢之一是從領域模型 (實體類 + 映射文件) 自動生成數據庫 DDL,消除手寫 SQL 的重複勞動與不一致風險。本文介紹基於 hibernate.cfg.xml + .hbm.xml 配置,通過 SchemaExport 工具類與編程式 API 實現數據庫表結構的創建、更新、導出 SQL 腳本,覆蓋開發、測試、生產部署全生命周期。
com.mysql.cj.jdbc.Driver
jdbc:mysql://localhost:3306/hibtest?useSSL=false&serverTimezone=UTC
root
123456
10
org.hibernate.dialect.MySQL5InnoDBDialect
true
true
update
update
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import java.io.File;
public class SchemaManager {
public static void main(String[] args) {
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
// 1. 直接執行創建 (不導出腳本)
SchemaExport export = new SchemaExport(cfg);
export.create(true, true); // (輸出到控制台, 執行到數據庫)
// 2. 僅導出 SQL 文件 (不執行),供 DBA 審核/生產部署
export.setOutputFile("schema-create.sql");
export.create(true, false); // (輸出到文件, 不執行)
// 3. 導出 Drop 腳本
export.setOutputFile("schema-drop.sql");
export.drop(true, false);
// 4. 更新模式 (慎用!生產不可控)
// export.execute(true, false, false, cfg.getProperties(), new MetadataSources(cfg).buildMetadata());
}
}
org.hibernate.orm.tooling
hibernate-enhance-maven-plugin
5.6.15.Final
hbm2ddl
process-classes
src/main/resources/hibernate.cfg.xml
false
target/schema.sql
CREATE TABLE `user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL UNIQUE,
`password` VARCHAR(100) NOT NULL,
`email` VARCHAR(100),
`created_at` DATETIME NOT NULL,
`status` INT NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
| 需求 | 配置方式 |
|---|---|
| 指定表引擎/字符集 | 映射文件 <class table="t" ...> 無直接屬性,需用方言擴展或註解 @Table(appliesTo="t", options="ENGINE=InnoDB DEFAULT CHARSET=utf8mb4") (需註解映射) |
| 自定義類型映射 | 實現 UserType / CompositeUserType,映射文件 type="com.example.MyType" |
| 命名策略 (駝峰轉下劃線) | 配置 hibernate.implicit_naming_strategy / physical_naming_strategy (Hibernate 5+) |
| 多 Schema 支持 | 映射文件 schema="schema_name" 或默認屬性 hibernate.default_schema |
| 外鍵約束名稱 | <key column="dept_id" foreign-key="FK_EMP_DEPT"/> |
| 索引定義 | <property name="email" ...><index name="IDX_USER_EMAIL"/></property> |
# application-dev.properties
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
# application-test.properties
hibernate.hbm2ddl.auto=create-drop
hibernate.show_sql=false
# application-prod.properties
hibernate.hbm2ddl.auto=validate # 嚴禁自動修改生產庫!
hibernate.show_sql=false
# 生產變更流程:開發環境驗證 -> 導出 SQL 文件 -> DBA 審核 -> 變更窗口執行 -> 驗證
`user` 或配置 hibernate.globally_quoted_identifiers=trueMySQL8Dialect,5.7 用 MySQL5InnoDBDialect@Lob + @Column(columnDefinition="LONGTEXT") 避免 TINYBLOB 限制@Enumerated(STRING) 存字符串,避免 ordinal 導致擴展困難Hibernate SchemaExport 將領域模型作為唯一真實來源,自動生成標準化 DDL,消除「代碼與數據庫結構不一致」這一經典痛點。開發環境用 update 快速迭代,測試用 create-drop 保證隔離,生產嚴禁自動 DDL,採用導出 SQL → DBA 審核 → 變更窗口執行的規範流程。掌握配置文件、編程 API、構建插件三種方式,覆蓋從本地開發到 CI/CD 部署的全鏈路需求。