Hibernate 使用 XML 定義物件關聯映射(ORM)。標準映射文件包含:
<?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
schema="schemaName"
default-cascade="none"
auto-import="true"
package="test">
<class name="People" table="person">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="subclass" type="character"/>
<property name="name" type="string">
<column name="name" length="64" not-null="true"/>
</property>
<property name="sex" not-null="true" update="false"/>
<many-to-one name="friend" column="friend_id" update="false"/>
<set name="friends" inverse="true" order-by="id">
<key column="friend_id"/>
<one-to-many class="Cat"/>
</set>
</class>
</hibernate-mapping>
| 元素/屬性 | 用途 |
|---|---|
hibernate-mapping | 根元素,schema 指定資料庫綱要,default-cascade 設定預設級聯風格,auto-import 允許 HQL 使用非全限定類名,package 設定類名前綴 |
class | 定義持久化類別,name 為類別名,table 對應資料表 |
id | 主鍵映射,內含 generator 指定識別碼產生策略 |
discriminator | 繼承關係辨識欄位(單表策略) |
property | 一般屬性映射,可巢狀 column 細節設定 |
many-to-one | 多對一關聯 |
set + one-to-many | 一對多關聯(集合端),inverse="true" 由關聯擁有者維護關係 |
組件(component)將子物件屬性映射至父實體同一資料表。動態組件(dynamic-component)支援執行時決定結構。
<component name="propertyName" class="className"
insert="true|false" update="true|false"
access="field|property|ClassName">
<property .../>
<many-to-one .../>
...
</component>
name:屬性名class:組件類別insert/update:是否出現在 INSERT/UPDATE SQLaccess:屬性存取策略hibernate.properties)hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost:3306/db
hibernate.connection.username = user
hibernate.connection.password = password
hibernate.dialect = net.sf.hibernate.dialect.MySQLDialect
hibernate.show_sql = true
hibernate.cfg.xml)<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"https://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property>
<property name="connection.url">jdbc:mysql://localhost:3306/STU</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/stuman/domain/Admin.hbm.xml"/>
<mapping resource="com/stuman/domain/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
兩種格式可共存,XML 設定會覆蓋 Properties 同名屬性。
OID 是關聯式主鍵在 Java 物件模型的對應物。Hibernate 透過 OID 維護 Session 快取中物件與資料列的對應。
Transaction tx = session.beginTransaction();
User u1 = (User) session.load(User.class, new Long(1));
User u2 = (User) session.load(User.class, new Long(1));
User u3 = (User) session.load(User.class, new Long(3));
System.out.println(u1 == u2); // true(同一 Session 快取)
System.out.println(u1 == u3); // false
| 策略 | 適用情境 | 說明 |
|---|---|---|
| increment | 代理主鍵 | Hibernate 記憶體遞增,單進程安全 |
| identity | 代理主鍵 | 資料庫自動遞增(MySQL、SQL Server) |
| sequence | 代理主鍵 | 資料庫 Sequence(Oracle、PostgreSQL) |
| hilo | 代理主鍵 | High/Low 演算法,高效能 |
| seqhilo | 代理主鍵 | Sequence + HiLo |
| native | 代理主鍵 | 自動選擇 identity/sequence/hilo |
| uuid.hex | 代理主鍵 | 128-bit UUID,16進位字串 |
| uuid.string | 代理主鍵 | UUID 編碼為 16 字元字串 |
| assigned | 自然主鍵 | 應用程式自行指派 |
| foreign | 代理主鍵 | 使用關聯物件的識別碼 |
映射類型是 Java 型別與 SQL 型別的橋梁,分為內建與自訂兩類。
| Hibernate 類型 | Java 類型 | SQL 類型 |
|---|---|---|
| integer / int | java.lang.Integer / int | INTEGER |
| long | java.lang.Long / long | BIGINT |
| string | java.lang.String | VARCHAR |
| boolean / yes_no / true_false | java.lang.Boolean | BIT |
| date | java.util.Date / java.sql.Date | DATE |
| timestamp | java.util.Date / java.sql.Timestamp | TIMESTAMP |
| binary | byte[] | BLOB |
| text | java.lang.String | CLOB |
| serializable | 實作 Serializable 的任意類別 | BLOB |
| clob / blob | java.sql.Clob / Blob | CLOB / BLOB |
| locale / timezone / currency | java.util.* | VARCHAR |
實作 net.sf.hibernate.UserType 或 CompositeUserType 介面,可將特殊 Java 類別映射為資料庫欄位(如將 Money 物件拆分為金額與幣別兩欄)。詳細實作請參考官方文件。