1. 基於相同實體類和表,實現相互映射,類的對象對應了表中的記錄,不一樣對象對應不一樣的記錄,不一樣的記錄對應不一樣的對象 java
2. 表中不一樣的記錄經過主鍵來區分,不一樣的對象經過對象id來區分,對象id是對象中的一個成員變量,該變量的值惟一性的標識了對象。 mysql
3.對象id和表主鍵的映射構成了ORM的核心 算法
4.數據庫每每具有特定的主鍵生成算法,而對象系統則不具有,因此要配置特定的策略,以使對象具有和數據庫中的數據同步的對象標識。 sql
1.主鍵生成策略是經過配置文件來實現的 數據庫
2. 映射文件中<id>標籤對應的是表中的主鍵列 服務器
3.<generator>子標籤配置主鍵的生成策略 網絡
4.class屬性值指定具體的策略,能夠有如下identity,sequence,hilo,native,swqhilo,increment,uuid,assigned,foreign,select session
<id name="id" column="表主鍵字段名" type="java.lang.Integer"> 併發
<generator class="設置主鍵生成策略類型"/> oracle
</id>
1.Assigned
Assigned方式由程序生成主鍵值,而且要在save()以前指定不然會拋出異常
特色:主鍵的生成值徹底由用戶決定,與底層數據庫無關。用戶須要維護主鍵值,在調用session.save()以前要指定主鍵值。
2.Hilo
Hilo使用高低位算法生成主鍵,高低位算法使用一個高位值和一個低位值,而後把算法獲得的兩個值拼接起來做爲數據庫中的惟一主鍵。Hilo方式須要額外的數據庫表和字段提供高位值來源。默認請況下使用的表是
hibernate_unique_key,默認字段叫做next_hi。next_hi必須有一條記錄不然會出現錯誤。
特色:須要額外的數據庫表的支持,能保證同一個數據庫中主鍵的惟一性,但不能保證多個數據庫之間主鍵的惟一性。Hilo主鍵生成方式由Hibernate 維護,因此Hilo方式與底層數據庫無關,但不該該手動修改hi/lo算法使用的表的值,不然會引發主鍵重複的異常。
3.Increment
Increment方式對主鍵值採起自動增加的方式生成新的主鍵值,但要求底層數據庫的支持Sequence。如Oracle,DB2等。須要在映射文件xxx.hbm.xml中加入Increment標誌符的設置。
特色:由Hibernate自己維護,適用於全部的數據庫,不適合多進程併發更新數據庫,適合單一進程訪問數據庫。不能用於羣集環境。
4.Identity
Identity當時根據底層數據庫,來支持自動增加,不一樣的數據庫用不一樣的主鍵增加方式。
特色:與底層數據庫有關,要求數據庫支持Identity,如MySQl中是 auto_increment, SQL Server 中是Identity,支持的數據庫有MySql、SQLServer、DB二、Sybase和HypersonicSQL。 Identity無需Hibernate和用戶的干涉,使用較爲方便,但不便於在不一樣的數據庫之間移植程序。
5.Sequence
Sequence須要底層數據庫支持Sequence方式,例如Oracle數據庫等
特色:須要底層數據庫的支持序列,支持序列的數據庫有DB二、PostgreSql、Qracle、SAPDb等在不一樣數據庫之間移植程序,特別從支持序列的數據庫移植到不支持序列的數據庫須要修改配置文件
6.Native
Native主鍵生成方式會根據不一樣的底層數據庫自動選擇Identity、Sequence、Hilo主鍵生成方式。
特色:根據不一樣的底層數據庫採用不一樣的主鍵生成方式。因爲Hibernate會根據底層數據庫採用不一樣的映射方式,所以便於程序移植,項目中若是用到多個數據庫時,可使用這種方式。
7.UUID
UUID使用128位UUID算法生成主鍵,可以保證網絡環境下的主鍵惟一性,也就可以保證在不一樣數據庫及不一樣服務器下主鍵的惟一性。
特色;可以保證數據庫中的主鍵惟一性,生成的主鍵佔用比較多的存貯空間
8.Foreign
Foreign用於一對一關係中,保證生成主鍵的惟一性,支持SQL Server和MySQL。
1. UUID、increment、Hilo、assigned對數據庫無依賴
2. identity:依賴Mysql或sql server,主鍵值不禁Hibernate維護
3. sequence:適合於oracle等支持序列的dbms,主鍵值不禁hibernate維護,由序列產生
4. native:根據底層數據庫的具體特性選擇適合的主鍵生成策略,若是是mysql或sqlserver,選擇identity,若是是oracle,選擇sequence。
提升系統新能的主要作法就是顯著減小數據庫的訪問次數。經過上面的分析,可做爲咱們考慮的一個指標。利用uuid方式生成Hibernate主鍵將提供最好的性能和數據庫平臺適應性。
你們積極交流,本身項目中的主鍵生成是什麼策略,以及優缺點是什麼,是如何處理的,給項目帶來的好處。