使用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位難讀的長字符串,但是它沒有跨數據庫的問題,將來切換數據庫極其簡單方便。推薦使用!!