1. 程式人生 > >Hibernate映射文件詳解(News***.hbm.xml)一

Hibernate映射文件詳解(News***.hbm.xml)一

value pack 覆蓋 翻譯 對象模型 pin set方法 問題 new

Hibernate是一個徹底的ORM(Object Relational Mapping,對象關系映射)開源框架。

我們先看一下官方文檔所給出的,Hibernate 體系結構的高層視圖:

其中PO=POJO+映射文件

根據體系結構視圖可以了解到整個利用Hibernate框架實現的項目包括整個重要的配置文件:

Hibernate配置文件:實現Hibernate基礎配置,是Hibernate能夠友好的與DB進行交互基礎;

開發時放置src目錄下,取名為:hibernate.cfg.xml(hibernate.properties)

Hibernate映射文件:實現POJO與DB表格的映射配置;

為了維護方便一般將其放置和相對應的POJO同一目錄下,取名為POJOName.hbm.xml。雖然一個映射文件中可以配置多個POJO與數據庫表的映射關系但是還是建議一個映射文件中只配置一個POJO與數據庫表的映射關系。

Hibernate的持久化類和關系數據庫之間的映射通常是用一個XML文檔來定義的。該文檔通過一系列XML元素的配置,來將持久化類與數據庫表之間建立起一一映射。這意味著映射文檔是按照持久化類的定義來創建的,而不是表的定義。

一、根元素:<hibernate-mapping>,每一個hbm.xml文件都有唯一的一個根元素,包含一些可選的屬性

1)package:指定一個包前綴,如果在映射文檔中沒有指定全限定的類名,就使用這個作為包名,如

<hibernate-mapping package="com.demo.hibernate.beans">

<class name="User" ...>

</hibernate-mapping>

<hibernate-mapping>

<class name="com.demo.hibernate.beans.User" ...>

</hibernate-mapping>

2)schema:數據庫schema的名稱

3)catalog:數據庫catalog的名稱

4)default-cascade:默認的級聯風格,默認為none

5)default-access:Hibernate用來訪問屬性的策略

6)default-lazy:指定了未明確註明lazy屬性的Java屬性和集合類,Hibernate會采取什麽樣的默認加載風格,默認為true

7)auto-import:指定我們是否可以在查詢語言中使用非全限定的類名,默認為true,如果項目中有兩個同名的持久化類,則最好在這兩個類的對應的映射文件中配置為false

二、<class>定義類:根元素的子元素,用以定義一個持久化類與數據表的映射關系,如下是該元素包含的一些可選的屬性

1)name:持久化類(或者接口)的Java全限定名,如果這個屬性不存在,則Hibernate將假定這是一個非POJO的實體映射

2)table:對應數據庫表名

3)discriminator-value:默認和類名一樣,一個用於區分不同的子類的值,在多態行為時使用

4)mutable:表明該類的實例是可變的或者是不可變的

5)schema:覆蓋根元素<hibernate-mapping>中指定的schema名字

6)catalog:覆蓋根元素<hibernate-mapping>中指定的catalog名字

7)proxy:指定一個接口,在延遲裝載時作為代理使用

8)dynamic-update:指定用於UPDATE的SQL將會在運行時動態生成,並且只更新那些改變過的字段

9)dynamic-insert:指定用於INSERT的SQL將會在執行時動態生成,並且只包含那些非空值字段

10)select-before-update:指定HIbernate除非確定對象真正被修改了(如果該值為true),否則不會執行SQL UPDATE操作。在特定場合(實際上,它只在一個瞬時對象關聯到一個新的Session中時執行的update()中生效),這說明Hibernate會在UPDATE之前執行一次額外的SQL SELECT操作,來決定是否應該執行UPDATE

11)polymorphism:多態,界定是隱式還是顯式的多態查詢

12)where:指定定個附加的SQLWHERE條件,在抓取這個類的對象時會增加這個條件

13)persister:指定一個定制的ClassPersister

14)batch-size:指定一個用於根據標識符(identifier)抓取實例時使用的‘batch size‘(批次抓取數量)

15)optimistic-lock:樂觀鎖定,決定樂觀鎖定的策略

16)lazy:通過設置lazy="false",所有的延遲加載(Lazy fetching)功能將未被激活(disabled)

17)entity-name

18)check:這是一個SQL表達式,用於為自動生成的schema添加多行(multi-row)約束檢查

19)rowid

20)subselect

21)abstract:用於在<union-subclass>的繼承結構(hierarchies)中標識抽象超類

三、<id>定義主鍵:Hibernate使用OID(對象標識符)來標識對象的唯一性,OID是關系數據庫中主鍵在Java對象模型中的等價物,在運行時,Hibernate根據OID來維持Java對象和數據庫表中記錄的對應關系

1)name:持久化類的標識屬性的名字

2)type:標識Hibernate類型的名字

3)column:數據庫表的主鍵這段的名字

4)unsaved-value:用來標誌該實例是剛剛創建的,尚未保存。可以用來區分對象的狀態

5)access:Hibernate用來訪問屬性值的策略

如果表使用聯合主鍵,那麽你可以映射類的多個屬性為標識符屬性。<composite-id>元素接受<key-property>屬性映射和<key-many-to-one>屬性映射作為子元素:

以下定義了兩個字段作為聯合主鍵:

<composite-id>

<key-property name="username" />

<key-property name="password" />

</composite-id>

四、<generator>設置主鍵生成方式

該元素的作用是指定主鍵的生成器,通過一個class屬性指定生成器對應的類。(通常與<id>元素結合使用)

<id name="id" column="ID" type="integer">

<generator class="native" />--native是Hibernate主鍵生成器的實現算法之一,由Hibernate根據底層數據庫自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式。

</id>

Hibernate提供的內置生成器:

1)assigned算法

2)hilo算法

3)seqhilo算法

4)increment算法

5)identity算法(推薦使用)

6)sequence算法

7)native算法

8)uuid.hex算法

9)uuid.string算法

10)foregin算法

11)select算法

五、<property>定義屬性

用於持久化類的屬性與數據庫表字段之間的映射,包含如下屬性:

1)name:持久化類的屬性名,以小寫字母開頭

2)column:數據庫表的字段名

3)type:Hibernate映射類型的名字

4)update:表明用於UPDATE的SQL語句中是否包含這個被映射的字段,默認為true

5)insert:表明用於INSERT的SQL語句中是否包含這個被映射是否包含這個被映射的字段,默認為true

6)formula:一個SQL表達式,定義了這個計算屬性的值

7)access:Hibernate用來訪問屬性值的策略

8)lazy:指定實例變量第一次被訪問時,這個屬性是否延遲抓取,默認為false(關系到後面的關系映射問題)

9)unique:使用DDL為該字段添加唯一的約束,此外,這也可以用做property-ref的目標屬性

10)not-null:使用DDL為該字段添加可否為空的約束

11)optimistic-lock:指定這個屬性在進行更新時是否需要獲得樂觀鎖定(換句話說,它決定這個屬性發生臟數據時版本version的值是否增長)

access屬性用來讓你控制Hibernate如何在運行時訪問屬性。默認情況下,Hibernate會使用屬性的get/set方法對。如果你指明access="field",則Hibernate會忽略get/set方法對,直接使用反射來訪問成員變量。

formula屬性是個特別強大的的特征。這些屬性應該定義為只讀,屬性值在裝載時計算生成。用一個SQL表達式生成計算的結果,它會在這個實例轉載時翻譯成一個SQL查詢的SELECT子查詢語句。如:

<property name="totalPrice" formula="(SELECT SUM(*) FROM user)" />

如:

<!-- 映射派生屬性 -->

<property name="desc" formula="(SELECT guang(author,":",title) FROM NEWS where NEWS.id=id></property>

Hibernate映射文件詳解(News***.hbm.xml)一