Hibernate 是開源 ORM 框架,對 JDBC 進行輕量級封裝,讓開發者用面向對象思維操作數據庫。本文演示最基礎操作:通過 POJO 和映射文件自動生成數據庫表(DDL)。
package com.bjpowernode.hibernate;
import java.util.Date;
public class User {
private String id;
private String name;
private String password;
private Date createTime;
private Date expireTime;
// 標準 Getter/Setter
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public Date getCreateTime() { return createTime; }
public void setCreateTime(Date createTime) { this.createTime = createTime; }
public Date getExpireTime() { return expireTime; }
public void setExpireTime(Date expireTime) { this.expireTime = expireTime; }
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.User">
<!-- 主鍵生成策略:UUID -->
<id name="id">
<generator class="uuid"/>
</id>
<property name="name" column="name"/>
<property name="password"/>
<property name="createTime"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
保存為 User.hbm.xml,放在包對應目錄下。
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"https://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="foo">
<!-- 數據庫連接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 映射文件引用 -->
<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
保存為 hibernate.cfg.xml,放在 src 根目錄。
package com.bjpowernode.hibernate;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class ExportDB {
public static void main(String[] args) {
// 載入配置
Configuration cfg = new Configuration().configure();
// 創建導出工具
SchemaExport export = new SchemaExport(cfg);
// 導出:打印 SQL、執行到數據庫
export.create(true, true);
}
}
### log4j.properties
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=warn, stdout
CREATE DATABASE hibernate_test;控制台輸出生成的 SQL:
Hibernate: create table User (id varchar(255) not null, name varchar(255), password varchar(255), createTime datetime, expireTime datetime, primary key (id)) ENGINE=InnoDB
數據庫中自動創建 User 表,結構與映射文件一致。
解析配置文件、映射文件,構建內部元數據模型,是 SessionFactory 的構建器。
基於元數據生成 DDL,支持:
create(true, true):輸出到控制台並執行到數據庫create(true, false):僅輸出 SQL 不執行drop(true, true):刪除表export.setOutputFile("schema.sql")MySQLDialect 確保生成的 SQL 符合 MySQL 語法(如 ENGINE=InnoDB、字段類型映射)。不同數據庫需切換對應方言。
| 問題 | 原因 | 解決 |
|---|---|---|
| 表未創建 | 數據庫不存在 | 先手動創建數據庫 |
| 驅動類找不到 | 缺少 mysql-connector-java | 添加依賴 |
| 映射文件未找到 | 路徑不匹配 | 檢查 mapping resource 路徑與包結構 |
| 方言不匹配 | 用 MySQL 方言連 Oracle | 修正 dialect 配置 |
@Entity
@Table(name="User")
public class User {
@Id @GeneratedValue(generator="uuid")
@GenericGenerator(name="uuid", strategy="uuid")
private String id;
@Column(name="name")
private String name;
// ...
}
配置文件中改用:<mapping class="com.bjpowernode.hibernate.User"/>
生產環境應關閉自動建表,改用專業遷移工具:
hibernate.hbm2ddl.auto=validate 僅校驗不修改SchemaExport 是 Hibernate 學習與原型開發的利器,能從對象模型自動生成數據庫結構,驗證映射正確性。但生產環境嚴禁自動 DDL,必須使用版本化遷移工具管理數據庫變更。掌握 POJO、映射文件、配置文件、方言的協作關係,是 Hibernate 開發的基石。