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

Hibernate 映射配置詳解:從基本元素到類型系統完整指南

     編輯:Java 相關知識

一、映射文件結構與核心元素

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 SQL
  • access:屬性存取策略

三、Hibernate 基本配置

1. Properties 格式 (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

2. XML 格式 (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) 與生成策略

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代理主鍵使用關聯物件的識別碼

五、Hibernate 映射類型系統

映射類型是 Java 型別與 SQL 型別的橋梁,分為內建與自訂兩類。

內建映射類型對照表(節錄)

Hibernate 類型Java 類型SQL 類型
integer / intjava.lang.Integer / intINTEGER
longjava.lang.Long / longBIGINT
stringjava.lang.StringVARCHAR
boolean / yes_no / true_falsejava.lang.BooleanBIT
datejava.util.Date / java.sql.DateDATE
timestampjava.util.Date / java.sql.TimestampTIMESTAMP
binarybyte[]BLOB
textjava.lang.StringCLOB
serializable實作 Serializable 的任意類別BLOB
clob / blobjava.sql.Clob / BlobCLOB / BLOB
locale / timezone / currencyjava.util.*VARCHAR

自訂映射類型

實作 net.sf.hibernate.UserType 或 CompositeUserType 介面,可將特殊 Java 類別映射為資料庫欄位(如將 Money 物件拆分為金額與幣別兩欄)。詳細實作請參考官方文件。

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