Hibernate 核心任務是實現持久層操作,而 O/R 映射 (Object-Relational Mapping) 是連接 Java 物件世界與關聯式資料庫的關鍵紐帶。本文梳理從資料庫表 → 映射檔 → 實體類的標準化建立流程,並以完整範例逐層解析配置要點。
CREATE TABLE reg (
Id int(6) unsigned NOT NULL auto_increment,
username varchar(16) default NULL,
password varchar(20) default NULL,
phone int(11) default NULL,
email varchar(30) default NULL,
address varchar(50) default NULL,
sex varchar(4) default NULL,
PRIMARY KEY (Id)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="mypack.Customer" table="reg">
<comment>Users may bid for or sell auction items.</comment>
<!-- 1. 主鍵映射 -->
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<!-- 2. 屬性/欄位映射 -->
<property name="username" not-null="true" column="username" type="string"/>
<property name="password" not-null="true" column="password" type="string"/>
<property name="phone" not-null="true" column="phone" type="string"/>
<property name="email" not-null="true" column="email" type="string"/>
<property name="address" not-null="true" column="address" type="string"/>
<property name="sex" not-null="true" column="sex" type="string"/>
</class>
</hibernate-mapping>
package mypack;
import java.io.Serializable;
public class Customer implements Serializable {
private int id;
private String username;
private String email;
private String password;
private String phone;
private String sex;
private String address;
public Customer() {} // 無參建構子 (Hibernate 必須)
// 標準 getter/setter
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getPhone() { return phone; }
public void setPhone(String phone) { this.phone = phone; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public String getAddress() { return address; }
public void setAddress(String address) { this.address = address; }
public String getSex() { return sex; }
public void setSex(String sex) { this.sex = sex; }
}
<class><class name="mypack.Customer" table="reg">
name:完整類別名 (含套件)table:對應資料庫表名<id><id name="id" column="id" type="int">
<generator class="native"/>
</id>
name:實體類屬性名column:資料庫主鍵欄位名type:Hibernate 類型 (對應 JDBC/Java 類型)generator:主鍵生成策略
native:根據資料庫自動選擇 (identity/sequence/hilo)increment、assigned、uuid 等延伸閱讀: 主鍵生成機制詳解 → 相關文章
<property><property name="address"
not-null="true"
column="address"
type="string"/>
name:實體屬性名column:資料庫欄位名 (若同名可省略)type:Hibernate 類型 (string, int, date, timestamp 等)not-null:對應資料庫 NOT NULL 約束,也影響 Hibernate 驗證length、unique、insert/update (控制是否包含在 SQL)、formula (衍生屬性).hbm.xml 預設放置於實體類編譯後 .class 所在套件目錄 (如 mypack/Customer.hbm.xml),並在 hibernate.cfg.xml 中註冊:
<mapping resource="mypack/Customer.hbm.xml"/>
掌握此標準化流程,O/R 映射建立不再是障礙,而是有條不紊的工程實踐。