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

Hibernate 入門實戰(二):資料庫 Schema 與對象關係映射文件詳解

     編輯:Java 相關知識

在上一篇文章中,我們介紹了 Hibernate 的基本架構與配置文件建立。本篇將深入探討如何建立資料庫 Schema、設計持久化類別與資料表的對應關係,以及編寫核心的對象關係映射(ORM)文件。透過一個完整的 Customer 客戶實體範例,我們將逐步拆解映射文件的結構、DTD 規範、屬性型別對應與主鍵生成策略等關鍵概念。

一、建立資料庫 Schema:CUSTOMERS 表結構設計

首先,我們需要在 MySQL 資料庫中建立與 Customer 類別對應的 CUSTOMERS 資料表。以下是標準的 DDL 定義:

create table CUSTOMERS (
 ID bigint not null primary key,
 NAME varchar(15) not null,
 EMAIL varchar(128) not null,
 PASSWORD varchar(8) not null,
 PHONE int,
 ADDRESS varchar(255),
 SEX char(1),
 IS_MARRIED bit,
 DESCRIPTION text,
 IMAGE blob,
 BIRTHDAY date,
 REGISTERED_TIME timestamp
);

資料表結構示意圖

SQL 型別對應表

表中的 ID 欄位為主鍵,對應 Java 類別的 id 屬性。各欄位涵蓋了字串、數值、布林、日期、二進位等多種 SQL 資料型別,完整對應表 2-2 所示的型別對照表。

二、建立對象關係映射文件:Customer.hbm.xml

Hibernate 使用 XML 格式的映射文件(.hbm.xml)來定義 Java 類別與資料表之間的對應關係。執行時期,Hibernate 會依據此文件自動生成 SQL 語句。建議每個持久化類別對應一個獨立的映射文件,並與該類別的 .class 檔案放置於同一目錄下,便於團隊協作與維護。

2.1 映射文件完整範例

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
 "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
 "https://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
 <class name="mypack.Customer" table="CUSTOMERS">

 <id name="id" column="ID" type="long">
 <generator class="increment"/>
 </id>

 <property name="name" column="NAME" type="string" not-null="true" />
 <property name="email" column="EMAIL" type="string" not-null="true" />
 <property name="password" column="PASSWORD" type="string" not-null="true"/>
 <property name="phone" column="PHONE" type="int" />
 <property name="address" column="ADDRESS" type="string" />
 <property name="sex" column="SEX" type="character"/>
 <property name="married" column="IS_MARRIED" type="boolean"/>
 <property name="description" column="DESCRIPTION" type="text"/>
 <property name="image" column="IMAGE" type="binary"/>
 <property name="birthday" column="BIRTHDAY" type="date"/>
 <property name="registeredTime" column="REGISTERED_TIME" type="timestamp"/>
 </class>
 </hibernate-mapping>

2.2 文件類型定義(DTD)解析

映射文件開頭必須宣告 DTD(Document Type Definition),Hibernate 的 XML 解析器會依據 DTD 驗證語法正確性。DTD 定義了 <hibernate-mapping> 為根元素,其子元素包含 <class>、<id>、<property> 等,且嚴格規定了元素的出現順序與次數限制(如 ? 表示 0 或 1 次,* 表示 0 次或多次,+ 表示 1 次或多次)。

DTD 特殊符號說明表

若違反元素順序(例如將 <property> 放在 <id> 之前),執行時將拋出 MappingException,錯誤訊息會明確指出內容模型不符合 DTD 定義的順序要求。

2.3 核心映射元素詳細說明

<class> 元素:類別與資料表對應

<class name="mypack.Customer" table="CUSTOMERS"> 指定完整類別名稱與對應資料表名。若省略 table 屬性,Hibernate 預設使用類別簡單名稱(此處為 Customer)作為資料表名。

<id> 元素:主鍵與 OID 映射

<id name="id" column="ID" type="long">
 <generator class="increment"/>
</id>

<id> 定義持久化類別的物件識別碼(OID)與資料表主鍵的對應。<generator> 子元素指定主鍵生成策略,本例使用 increment 由 Hibernate 自行遞增;實務上常搭配資料庫序列或身分識別欄位,詳細策略將於後續章節深入探討。

<property> 元素:一般屬性映射

每個 <property> 對應一個類別屬性與資料表欄位,主要屬性包括:

  • name:Java 類別屬性名稱
  • column:資料表欄位名,預設同屬性名
  • type:Hibernate 映射型別,作為 Java 型別與 SQL 型別的橋樑
  • not-null:是否允許 null 值,預設 false

2.4 Hibernate 映射型別與 Java/SQL 型別對應表

型別對應表

關鍵對應規則如下:

Java 型別Hibernate 型別SQL 型別範例
java.lang.StringstringVARCHARname, email, password
java.lang.StringtextTEXTdescription
byte[]binaryBLOBimage
intintINTphone
charcharacterCHAR(1)sex
booleanbooleanBITmarried
java.sql.DatedateDATEbirthday
java.sql.TimestamptimestampTIMESTAMPregisteredTime

若未顯式指定 type,Hibernate 會透過反射自動推斷預設映射型別(如 String 預設為 string)。但當 Java 型別相同而 SQL 型別不同時(如 String 對應 TEXT vs VARCHAR),必須顯式指定 type="text" 或 type="binary" 等。

2.5 not-null 屬性與資料驗證策略

設定 not-null="true" 時,Hibernate 在持久化前會先檢查屬性值,若為 null 則拋出 PropertyValueException;若未設定,則直接送交資料庫,由資料庫拋出約束違規錯誤。前者能在開發測試階段提早發現問題,但實際生產環境中,資料驗證應由表述層或業務邏輯層負責,避免非法資料傳遞至資料庫層造成效能浪費。

資料驗證流程圖

2.6 <column> 子元素:進階欄位定義

除了 column 屬性,也可使用 <column> 子元素定義欄位,功能更強大:

<property name="name" type="string">
 <column name="NAME" sql-type="varchar(15)" not-null="true" index="idx_name" />
</property>

<column> 可指定 sql-type、index、unique 等屬性,主要配合 hbm2ddl 工具自動生成 Schema 使用;若 Schema 為手工建立,通常僅需設定 name 與 not-null 即可。

2.7 完整映射關係圖示

Customer.hbm.xml 映射關係圖

三、XML 映射文件的優勢總結

  1. 非侵入性:Hibernate 不滲透到領域模型與資料模型,雙方可獨立設計。
  2. 靈活性高:修改映射關係只需調整 XML,無需修改 Java 程式碼,降低耦合度。
  3. 利於團隊協作:映射文件與類別分離,便於版本控制與並行開發。

掌握映射文件的撰寫與 DTD 規範,是駕馭 Hibernate 進行企業級資料持久化開發的基石。下一章將介紹 Hibernate 組態文件的進階配置與 SessionFactory 的建立與管理。

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