實體類------>表
實體類的設計原則:
* 實現一個默認(無參)的構造方法(constructor)
* 提供一個標識屬性(identifier property)
* 使用非final的類
* 為持久化字段聲明訪問器(accessors),即get/set方法
實體類中的普通屬性----->表字段
采用<class>標簽映射成數據庫表,通過<property>標簽將普通屬性映射成表字段
所謂普通屬性不包括自定義類、集合和數組
注意:表或字段與sql關鍵字一樣,必須重名稱
<hibernate-mapping/>標簽
<hibernate-mapping
schema="schemaName" (1)
catalog="catalogName" (2)
default-cascade="cascade_style" (3)
default-access="field|property|ClassName" (4)
default-lazy="true|false" (5)
*auto-import="true|false" (6)
*package="package.name" (7)
/>
(6) auto-import (可選 - 默認為 true): 指定我們是否可以在查詢語言中使用非全限定的類名(僅限于本映射文件中的類)。
(7) package (可選): 指定一個包前綴,如果在映射文檔中沒有指定全限定的類名, 就使用這個作為包名。











<class
*name="ClassName" (1)
*table="tableName" (2)
*discriminator-value="discriminator_value" (3)
mutable="true|false" (4)
schema="owner" (5)
catalog="catalog" (6)
proxy="ProxyInterface" (7)
*dynamic-update="true|false" (8)
*dynamic-insert="true|false" (9)
select-before-update="true|false" (10)
polymorphism="implicit|explicit" (11)
where="arbitrary sql where condition" (12)
persister="PersisterClass" (13)
*batch-size="N" (14)
*optimistic-lock="none|version|dirty|all" (15)
*lazy="true|false" (16)
entity-name="EntityName" (17)
check="arbitrary sql check condition" (18)
rowid="rowid" (19)
subselect="SQL expression" (20)
*abstract="true|false" (21)
node="element-name"
/>
(1) name (可選): 持久化類(或者接口)的Java全限定名。 如果這個屬性不存在,Hibernate將假定這是一個非POJO的實體映射。
(2) table (可選 - 默認是類的非全限定名): 對應的數據庫表名。
(3) discriminator-value (可選 - 默認和類名一樣): 一個用于區分不同的子類的值,在多態行為時使用。它可以接受的值包括 null 和 not null。
(8) dynamic-update (可選, 默認為 false): 指定用于UPDATE 的SQL將會在運行時動態生成,并且只更新那些改變過的字段。
(9) dynamic-insert (可選, 默認為 false): 指定用于INSERT的 SQL 將會在運行時動態生成,并且只包含那些非空值字段。
(14) batch-size (可選,默認是1) 指定一個用于 根據標識符(identifier)抓取實例時使用的"batch size"(批次抓取數量)。
(15) optimistic-lock(樂觀鎖定) (可選,默認是version): 決定樂觀鎖定的策略。
(16) lazy (可選): 通過設置lazy="false", 所有的延遲加載(Lazy fetching)功能將被全部禁用(disabled)。
(21) abstract (可選): 用于在<union-subclass>的繼承結構 (hierarchies)中標識抽象超類。
<id/>標簽 -主鍵
主鍵生成策略:
uuid native 和assigned
<id
*name="propertyName" (1)
type="typename" (2)
*column="column_name" (3)
unsaved-value="null|any|none|undefined|id_value" (4)
access="field|property|ClassName" (5)
node="element-name|@attribute-name|element/@attribute|.">
*length (6)
<generator class="generatorClass"/>
</id>
(1) name (可選): 標識屬性的名字。
(2) type (可選): 標識Hibernate類型的名字。
(3) column (可選 - 默認為屬性名): 主鍵字段的名字。
(4) unsaved-value (可選 - 默認為一個切合實際(sensible)的值): 一個特定的標識屬性值,用來標志該實例是剛剛創建的,尚未保存。 這可以把這種實例和從以前的session中裝載過(可能又做過修改--譯者注) 但未再次持久化的實例區分開來。
(5) access (可選 - 默認為property): Hibernate用來訪問屬性值的策略。
(6) 長度.
<id name="id" type="long" column="cat_id">
<generator class="uuid">
</generator>
</id>
identity
對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內置標識字段提供支持。 返回的標識符是long, short 或者int類型的。
sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的標識符是long, short或者 int類型的。
uuid
用一個128-bit的UUID算法生成字符串類型的標識符, 這在一個網絡中是唯一的(使用了IP地址)。UUID被編碼為一個32位16進制數字的字符串。
native
根據底層數據庫的能力選擇identity, sequence 或者hilo中的一個。
assigned
讓應用程序在save()之前為對象分配一個標示符。這是 <generator>元素沒有指定時的默認生成策略。
foreign
使用另外一個相關聯的對象的標識符。通常和<one-to-one>聯合起來使用。
<property
*name="propertyName" (1)
*column="column_name" (2)
type="typename" (3)
update="true|false" (4)
insert="true|false" (4)
formula="arbitrary SQL expression" (5)
access="field|property|ClassName" (6)
lazy="true|false" (7)
unique="true|false" (8)
not-null="true|false" (9)
optimistic-lock="true|false" (10)
generated="never|insert|always" (11)
node="element-name|@attribute-name|element/@attribute|."
index="index_name"
unique_key="unique_key_id"
length="L"
precision="P"
scale="S"
/>
(1) name: 屬性的名字,以小寫字母開頭。
(2) column (可選 - 默認為屬性名字): 對應的數據庫字段名。 也可以通過嵌套的<column>元素指定。
(4) update, insert (可選 - 默認為 true) : 表明用于UPDATE 和/或 INSERT 的SQL語句中是否包含這個被映射了的字段。這二者如果都設置為false 則表明這是一個“外源性(derived)”的屬性,它的值來源于映射到同一個(或多個) 字段的某些其他屬性,或者通過一個trigger(觸發器)或其他程序生成。
(7) lazy (可選 - 默認為 false): 指定 指定實例變量第一次被訪問時,這個屬性是否延遲抓取(fetched lazily)( 需要運行時字節碼增強)。
(8) unique (可選): 使用DDL為該字段添加唯一的約束。 同樣,允許它作為property-ref引用的目標。
(9) not-null (可選): 使用DDL為該字段添加可否為空(nullability)的約束。
映射文件中一般類型中可以省略,其他不略