首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate O/R 映射基礎完全指南:從資料庫表到實體類的標準化流程

     編輯:Java 相關知識

Hibernate 核心任務是實現持久層操作,而 O/R 映射 (Object-Relational Mapping) 是連接 Java 物件世界與關聯式資料庫的關鍵紐帶。本文梳理從資料庫表 → 映射檔 → 實體類的標準化建立流程,並以完整範例逐層解析配置要點。

學習心法

  • 不要為學 Hibernate 而學,**從架構層次理解其內涵**:追求效能低、耦合低、封裝強的持久層
  • 操作本身不難,**關鍵在思路清晰**:表 → 映射檔 → 類,三步驟對應
  • 推薦參考書:《深入淺出 Hibernate》(夏昕/曹曉剛/唐勇),但需自我多實作體會精髓

O/R 映射三階段建立流程

  1. 資料庫表存在 — 映射基礎
  2. 建立 .hbm.xml 映射配置檔 — 媒介
  3. 撰寫實體類 (POJO) — 映射產出的 Java 類

完整範例:Customer 實體映射

1. 資料庫表定義 (MySQL)

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;

2. 映射檔 (Customer.hbm.xml)

<?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>

3. 實體類 (Customer.java)

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; }
}

映射檔核心元素深度解析

1. 類別-表映射:<class>

<class name="mypack.Customer" table="reg">
  • name:完整類別名 (含套件)
  • table:對應資料庫表名

2. 主鍵映射:<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 等

延伸閱讀: 主鍵生成機制詳解 → 相關文章

3. 屬性映射:<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"/>

關鍵成功因素

  1. 思路清晰:表 → 映射 → 類,三者一一對應
  2. 命名一致:屬性名、欄位名、getter/setter 严格對應
  3. 類型匹配:Hibernate type、資料庫型別、Java 型別三方一致
  4. 無參建構子:Hibernate 實例化實體必須
  5. 實作 Serializable:支援跨 Session/叢集環境

掌握此標準化流程,O/R 映射建立不再是障礙,而是有條不紊的工程實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved