3-Hibernate mapping file

来源:互联网 发布:java path接口 编辑:程序博客网 时间:2024/05/17 06:43
 1.classname.hbm.xml
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC 
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping 
  6.     package="com.unicorn.hibernate.domain">
  7.     <class name="Unicorn">
  8.         <id name="id">
  9.             <generator class="assigned"/>
  10.         </id>
  11.         <!-- unique確保name唯一 -->
  12.         <property name="name" unique="true"/>
  13.         <property name="birthday"/>
  14.     </class>
  15. </hibernate-mapping>

這里的hibernate映射文件就是 用于說明Java對象與哪個表中的記錄相對應.以及Java對象的各個屬性分別對應表中的哪一列,不同性質的屬性(例如:主鍵和普通屬性)用不同的標簽來映射,如果Java對象中的某個屬性不需要保存在數據庫中,那么在Hibernate映射文件中就不需要配置這個屬性.


主鍵生成方式:<generatorclass=”native”></generator>

Class屬性有以下幾種類型:

I.Assigned

       主鍵由應用邏輯產生,數據交由Hibernate保存時,主鍵值已經設置完畢,無需Hibernate干預.

II.hilo

       通過hi/lo算法實現的主鍵生成機制,需要額外的數據庫表保存主鍵生成歷史狀態.

III.seqhilo

       hilo類似,通過hi/lo算法實現的主鍵生成機制,只是主鍵歷史狀態保存在Sequence,適用于支持Sequence的數據庫,Oracle.

IV.increment

       主鍵按數值順序遞增.

       此實現機制為在當前應用實例中維持一個變量以保存當前的最大值,之后每次需要生成主鍵的時候將此值加1作為主鍵.

       由于各個實例各自維護主鍵狀態,不同實例可能生成同樣的主鍵,因此,如果同一個數據庫有多個實例訪問,此方式必須避免使用.

V.identity

       采用數據庫提供的主鍵生成機制,SQL Server,MySQL中的自增主鍵生成機制.

VI.sequence

       采用數據庫提供的sequence機制生成逐漸.Oracle Sequence

VII.native

       Hibernate根據數據庫適配器中的定義,自動采用identity,hilo,sequence的其中一種作為主鍵生成方式.

VIII.uuid.hex

       Hibernate基于128位惟一值產生算法,根據當前設備IP,時間,JVM啟動時間,內部自增量等4個參數生成十六進制數值(編碼后以長度為32位的字符串表示)主鍵.

       一般而言,利用uuid.hex方式生成主鍵將提供最好的數據插入性能和數據庫平臺適應性.

IX.uuid.string

       uuid.hex類似,只是生成的主鍵未進行編碼(長度16).在某些數據庫中可能出現問題(PostgreSQL);

X.foreign

       使用外部表的字段作為主鍵,此類主鍵生成機制我們將在數據關聯部分再講解.

XI.select

       Hibernate3 中新引入的主鍵獲取機制,主要針對遺留系統的改造工程.

Hibernate3同時還提供了另一種與實體類型無關的映射方式:動態模型(Dynamic Model),即通過通用數據容器(Map)對庫表記錄進行表達.

       對于以上實例,動態模型方式的映射文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
  4. <hibernate-mapping>
  5.     <class entity-name="DynamicUnicornMap " table="Unicorn">
  6.         <id name="id" column="id" type="java.lang.Integer">
  7.             <generator class="assigned"></generator>
  8.         </id>
  9.         <property name="name" column="name" type="java.lang.String"></property>
  10.         <property name="age" column="age" type="java.lang.Integer"></property>
  11.     </class>
  12. </hibernate-mapping>

此類對應的操作代碼示例如下:(以數據保存為例)

  1. session =sessionFactory.openSession().getSession(EntityMode.MAP);
  2. Map unicornMap = new HashMap();
  3. unicornMap .put(“name”,”unicorn”);
  4. unicornMap .put(“age”,new Integer(25));
  5. Transaction tx=session.beginTransaction();
  6. session.save(“DynamicUnicornMap”,unicornMap );
  7. tx.commit();

其中, session.save(“DynamicUnicornMap”,unicornMap);中的”DynamicUnicornMap”即配置中定義的實體名.Hibernate將根據實體名所對應的映射配置,完成動態模型的持久化操作.



原创粉丝点击