Hibernate學習筆記--映射配置文件詳解


參考資料:

http://blog.163.com/hzd_love/blog/static/13199988120108265317988/

http://www.cnblogs.com/oftenlin/archive/2013/03/29/2989096.html

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)中標識抽象超類

 

示例代碼:

<hibernate-mapping>
    <class name="com.hibernate.hql.Emp" table="EMP">
        <id name="eid" column="EID" type="java.lang.Integer">
            <generator class="increment" />
        </id>
        <property name="ename" column="ENAME" type="java.lang.String"/>
        <property name="eage" column="EAGE" type="java.lang.Integer"/>
        <property name="esal" column="ESAL" type="java.lang.Integer"/>
        <property name="did" column="DID" type="java.lang.Integer"/>
    </class>
</hibernate-mapping>

 

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

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算法

 

主要是由generator子元素是指定主鍵生成策略,詳細說明如下:
<id name="id">
    <generator class="native"/>
</id>

<!-- identity,使用數據庫的自動增長,在保存時會忽略手工指定的主鍵值而由數據庫生成,要求此屬性要是數字類型-->
      <generator class="identity"/>

<!-- assigned,手工指定,比如指定UUID-->
      <generator class="assigned"/>

<!-- uuid,由Hibernate生成UUID並指定為主鍵值,要求此屬性要是String型-->
      <generator class="uuid"/>

<!-- hilo,高低位生成主鍵,需要用到一個額外的表,所有的數據庫都可以使用這種類型-->
      <generator class="hilo">
        <param name="table">hi_value</param>
        <param name="column">next_value</param>
        <param name="max_lo">100</param>
      </generator>

<!-- native,根據底層數據庫的能力選擇 identity、sequence 或者 hilo 中的一個--> <generator class="native"/>

 

五、<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)" />


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM