Hibernate 主鍵生成策略

使用hibernate添加記錄 出現主鍵值爲空。主鍵沒有默認值。查閱主鍵生成方式得知:主鍵由自己指定時,不能用native而用assigned策略。

 

generator 用來爲該持久類生成唯一標識。下面介紹幾種主鍵生成策略: 

assigned 
主鍵由外部程序負責生成,在 save() 之前指定一個。 

hilo 
通過hi/lo 算法實現的主鍵生成機制,需要額外的數據庫表或字段提供高位值來源。 

seqhilo 
與hilo 類似,通過hi/lo 算法實現的主鍵生成機制,需要數據庫中的 sequence,適用於支持 sequence 的數據庫,如oracle。 

increment 
increment由hibernate管理主鍵。此方式的實現機制爲在當前應用實例中維持一個變量,以保存着當前的最大值,之後每次需要生成主鍵的時候將此值加1作爲主鍵。這種方式可能產生的問題是:不能在集羣下使用。原因: 
increment主鍵生成器的org.hibernate.id.IncrementGenerator類裏面,是使用select max( columnName ) from tableName的方式來獲取。IncrementGenerator類裏面的generate()方法雖然被聲明成了synchronized,然而synchronized只能在一個獨立的Java虛擬機內部有效。所以,在多個服務器中用 select max同時取主鍵,就相當於在沒有synchronized的保護下,併發時就會取出相同的值,再insert就會發生dumplicate entry的錯誤。 
官方文檔:只有在沒有其他進程往同一張表中插入數據時才能使用,在集羣下不要使用 

identity 
identity由底層數據庫生成標識符。identity是由數據庫自己生成的,但這個主鍵必須設置爲自增長,前提條件是低層數據庫支持自動增長字段類型,如db2、sql server、mysql、Sybase和HypersonicSQL的內置標識字段提供支持。 

sequence 
採用數據庫提供的 sequence 機制生成主鍵。如 oralce 、DB2、SAP DB,PostgerSQL、McKoi中的sequence。 

native 
由 hibernate 根據使用的數據庫自行判斷採用 identity、hilo、sequence 其中一種作爲主鍵生成方式。 

uuid.hex 
由 hibernate 基於128 位 uuid 算法 生成16 進制數值(編碼後以長度32 的字符串表示)作爲主鍵。 

uuid.string 
與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16),不能應用在 postgresql 數據庫中。 

foreign 
使用另外一個相關聯的對象的標識符作爲主鍵。 

Hibernate中唯一一種最簡單通用的主鍵生成器就是uuid。雖然是個32位難讀的長字符串,但是它沒有跨數據庫的問題,將來切換數據庫極其簡單方便。推薦使用!!

發佈了44 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章