1. 程式人生 > >hibernate的11種主鍵生成方式

hibernate的11種主鍵生成方式

hibernate提供了很多種主鍵的生成方式,以解決實際開發中各種不同的資料庫以及其主鍵的策略,以前的時候,也有用過很多種,但是都不全面,這次在書上看到了,便記錄下來,方便以後檢視,使用。

1.Assigned:主鍵有應用的邏輯產生,資料經由hibernate儲存時,主鍵值以設定完畢,無需hibernate干預。

2.hilo:通過hi/lo演算法,實現主鍵生成機制,需要額外的資料庫表儲存記錄主鍵生成的歷史狀態。

3.seqhilo:類似於hilo,也是通過演算法,實現主鍵生成機制,但是無需額外表儲存,而是儲存在seqence中,此中策略適用於支援seqence的資料庫,如oracle等。

4.increment:主鍵按數值順序遞增。即當前應用中維持了一個變數,以儲存當前的最大值,之後每次生成主鍵,即在上次的數值上加一。這種方式的問題在於,假使有多個例項訪問資料庫,由於各個例項的主鍵狀態,以及可能生成的同樣的主鍵,以導致主鍵重複異常,因此,如果有多個例項訪問的情況下,需避免使用。

5.identity:採用資料庫提供的主鍵生成機制,如sql server,mysql中的自動增長機制,

6.sequence:採用資料提供的sequence機制生成主鍵,如oracle sequence。

7.native:由hibernate根據資料庫介面卡中的定義(即資料庫dialect指定的資料庫,自動採用identity,hilo,sequence這三種中的一種方式,作為主鍵生成方式)

8.uuid.hex:由hibernate基於128位唯一演算法,根據當前裝置ip,時間,jvm啟動時間,內部自動增量等4個引數,生成16進位制數值,作為主鍵,這種演算法最大程度保證了id的唯一性,幾時在多例項併發執行的情況下,也基本不會出現重複。假使真有重複,即裝置ip,時間,jvm啟動時間,內部增量都相同,那也需要幾萬年才能出現一次......所以,此方式提供了最好的資料庫插入效能和資料庫平臺適應性。

9.uuid.string:於uuid.hex類似,只是在某些資料庫中會出現問題,如PostgreSQL。

10.foreign:使用外部表的欄位作為主鍵。

11.select:hibernate3中新引入的主鍵機制,主要針對遺留系統改造。因為在早期的一些專案中,主鍵可能是依賴觸發器的捕獲操作,來生成主鍵的。此時,就需要設定為select方式,配置事例為:

Xml程式碼 
  1. <generator class="select">  
  2. <param name="key">key_field</param>  
  3. </generator>  

全部的11種全在這裡了,由於常用資料庫如sqlserver,mysql都提供自動增長,那我們一般可以選擇native方式生成主鍵。不過使用資料提供的機制有時候並不是最好的,在大量併發insert的時候,可能會出現表之間的互鎖情況,從而降低整個系統的效能。

另外,sequence作為主鍵機制的一種,如oracle中,每插入一條資料,hibernate需先向資料庫放鬆一條獲取sequence的語句,以得到sequence,從而獲取主鍵的值。這樣雖然不會出現問題,但是在高併發的insert情況下,還是對效能有一定的影響。

所以在大多數情況下,假使我們的邏輯允許,可以採用uuid.hex方式生成主鍵。