Hibernate中,各表映射文件...hbm.xml詳解

Hibernate中,各表映射文件...hbm.xml詳解

 
配置文件的基本結構如下:

Xml代碼

       <?xml version="1.0" encoding='UTF-8'?>      

    <!DOCTYPE hibernate-mapping PUBLIC  

      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  

        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

         <hibernate-mapping package="包名">  

        <class name="類名" table="表名">  

                <id name="主鍵在java類中的字段名" column="對應表中字段" type="類型">  

                    <generator class="主鍵生成策略"/>  

         </id>  

       

              ……  

         </class>  

    </hibernate-mapping>   

 

1. 主鍵(id
Hibernate
的主鍵生成策略有如下幾種:
1) assigned
主鍵由外部程序負責生成,在save() 之前指定。
2) hilo
通過hi/lo 算法實現的主鍵生成機制,需要額外的數據庫表或字段提供高位值來源。
3) seqhilo
hilo 類似,通過hi/lo 算法實現的主鍵生成機制,需要數據庫中的 Sequence,適用於支持 Sequence 的數據庫,如Oracle
4) increment
主鍵按數值順序遞增。此方式的實現機制爲在當前應用實例中維持一個變量,以保存着當前的最大值,之後每次需要生成主鍵的時候將此值加1作爲主鍵。這種方式可能產生的問題是:不能在集羣下使用。
5) identity
採用數據庫提供的主鍵生成機制。如DB2SQL ServerMySQL 中的主鍵生成機制。
6) sequence
採用數據庫提供的sequence 機制生成主鍵。如Oralce 中的Sequence
7) native
 Hibernate 根據使用的數據庫自行判斷採用 identityhilosequence 其中一種作爲主鍵生成方式。
8) uuid.hex
 Hibernate 基於128  UUID 算法 生成16 進制數值(編碼後以長度32 的字符串表示)作爲主鍵。
9) uuid.string
uuid.hex 類似,只是生成的主鍵未進行編碼(長度16),不能應用在 PostgreSQL 數據中。
10) foreign
使用另外一個相關聯的對象的標識符作爲主鍵。
主鍵配置舉例如下:

Xml代碼

1         <id name="id" column="id" type="java.lang.Integer">  

2                      <generator class="native"/>  

3         </id>  

另外還可以擴展Hibernate的類來做自己的主鍵生成策略,具體例子見:http://www.javaeye.com/topic/93391
2. 普通屬性(property

<property name="accessname" column="accessName" type="java.lang.String" not-null="true" />  

 <property name="state" column="state" type="java.lang.Byte" not-null="true" />  

 <property name="description" column="description" type="java.lang.String" /> 

 一對多關係(<many-to-one…/><set…></set>

      
 一對多關係一般是用在一個表與另一個表存在外鍵關聯的時候,例如用戶表的組織id與組織表存在外鍵關聯,則方爲組織表,方爲用戶表,因爲一個組織可以包含多個用戶,而一個用戶只能隸屬於一個組織。

   
 對於存在一對多關係和多對一關係的雙方,需要在…hbm.xml中進行相應配置,這時在方(例如:組織)需要在映射文件中添加<set…></set>元素,因爲它包含多個方的對象,一般的格式如下:

Xml代碼

1         <set name="java映射類中對應的屬性" inverse="true" lazy="true">  

2           <key column="表中對應字段"/>  

3              <one-to-many class="多方的類"/>  

4         </set>  

5           

6         <!-- 示例--> 

7         <set name="userSet" inverse="true" lazy="true">  

8               <key column="orgId"/>  

9               <one-to-many class="User"/>  

10     </set>  

方(例如:用戶)隸屬於一個方對象,一般的格式如下:

Xml代碼

11     <many-to-one name="java映射類中對應的屬性" column="表中對應字段" class="類名" not-null="true" />  

12       

13     <!-- 示例--> 

14     <many-to-one name="org" column="orgId" class="Organization" not-null="true" />  

4. 一對一關係(<one-to-one…/>

一對一關係相對一對多關係來說比較少見,但也在某些情況下要用到,例如有一個用戶的基本信息表(USER)和一個用戶的密碼錶(PASSWD)就存在一對一的關係。下面來看一下一對一關係在Hibernate的配置。

Xml代碼

15     <!-- 其中主表(eg. 用戶的基本信息表)的配置 --> 

16       

17     <one-to-one name="主表對象中子表對象的屬性名" class="子表對象的類名" cascade="save-update"/>  

18       

19     <one-to-one name="password" class="com.amigo.dao.pojo.Passwd" cascade="save-update"/>  

20       

21     <!-- 子表(eg. 用戶的密碼錶)的配置 --> 

22       

23     <one-to-one name="子表對象中主表對象的屬性名" class="主表對象的類名" constrained="true"/>  

24       

25     <one-to-one name="user" class="com.amigo.dao.pojo.User " constrained="true" />  

5. 多對多關係(<many-to-many…/>

在數據庫設計時,一般將多對多關係轉換爲兩個一對多(或多對一)關係,例如在基於角色的權限系統中,用戶和角色存在的關係就是典型的多對多關係,即一個用戶可以具有多個角色,而一個角色又可以爲多個用戶所有,一般在設計時,都會加一個用戶與角色的關聯表,該表與用戶表以及角色表都存在外鍵關聯。

在本小節中講述的是沒有分解的多對多關係在Hibernate中如何配置。設置格式如下:

Xml代碼

26     <set name="java對象的屬性名" table="表名" cascade="all" outer-join="false">    

27         <key column="表的對應字段"/>    

28         <many-to-many class="另一個表的對象類" column="另一個表的字段"/>    

29     </set>    

30       

31     <!-- t_user --> 

32     <set name="roleSet" table="t_user" cascade="all" outer-join="false">    

33         <key column="roleId"/>    

34         <many-to-many class="com.amigo.dao.pojo.Role" column="roleId"/>    

35     </set>    

36       

37     <!-- t_role --> 

38     <set name="userSet" table="t_role" cascade="all" outer-join="false">    

39         <key column="roleId"/>    

40         <many-to-many class="com.amigo.dao.pojo.User" column="roleId"/>    

41     </set>

6. 完整實例

在本小節中舉一些.hbm.xml映射文件的例子,讓開發人員對其有一個感性的認識。接下來講述一個用戶表(tbl_user)、用戶與角色關聯表(tbl_user_role)、角色表(tbl_role)以及組織表(tbl_organization)的例子。

1tbl_user

Xml代碼

1         <?xml version="1.0" encoding='UTF-8'?>  

2           

3         <!DOCTYPE hibernate-mapping PUBLIC  

4                   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  

5                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

6           

7         <hibernate-mapping package="com.amigo.dao.pojo">  

8             <class name="User" table="tbl_user">  

9               <id name="loginname" column="loginName" type="java.lang.String">  

10               <generator class="assigned"/>  

11          </id>  

12          <property name="name" column="name" type="java.lang.String" not-null="true" />  

13          <property name="password" column="password" type="java.lang.String" not-null="true"/>  

14          <property name="mobile" column="mobile" type="java.lang.String" />  

15          <property name="telephone" column="telephone" type="java.lang.String" />  

16          <property name="email" column="email" type="java.lang.String" />  

17          <property name="createtime" column="createTime" type="java.util.Date" not-null="true" />  

18          <property name="lastlogintime" column="lastLoginTime" type="java.util.Date" />  

19         <property name="logintimes" column="loginTimes" type="java.lang.Long" not-null="true"/>  

20          <property name="state" column="state" type="java.lang.Byte" not-null="true" />  

21         <property name="description" column="description" type="java.lang.String" />  

22         <many-to-one name="organization" column="orgId" class="Organization" not-null="true"/>  

23         <set name="userRoleSet" inverse="true" cascade="all-delete-orphan" lazy="true">  

24             <key column="loginName"/>  

25             <one-to-many class="UserRole"/>  

26         </set>  

27     </hibernate-mapping>   

轉自:http://blog.sina.com.cn/s/blog_77eba18f0101ar9h.html

  • 灌水
  • 贊
  • 美好
  • 頂
  • 頂
  • 頂
  • 開心
  • 路過
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章