主鍵生成策略大體分兩種:程序員
- 手工控制策略
- 自動生成策略【框架自動生成和數據庫自動生成】
手工控制策略:算法
assigned:類型是任意的,須要在 save() 到數據庫前,編碼人員手工設置主鍵值,也就是調用對象的 setter方法進行賦值操做。sql
注:能夠跨數據庫,可是手動控制不能保證不重複,不推薦使用。數據庫
自動生成策略:服務器
1 . uuid:自動生成 32 位及以上的隨機字符串,生成的依據包括但不限於網卡地址,時間值等。多線程
注:能夠跨數據庫,效率高,能保證惟一性,推薦使用【雖然佔用空間大】併發
2 . increment:自動獲取數據庫中主鍵的最大值【整數型】,自動加一後賦值給對象。框架
注:能夠跨數據庫,可是不適合羣集下使用,多線程併發更新數據庫會取出相同的主鍵值。dom
3 . identity:數據庫主鍵設爲自動增加【整數型】。ide
注:適用於MySQL,DB2,SQLserver,不適用於Oracle。
4 . sequence:數據庫主鍵設爲自動增加【整數型】。
注:適用於Oracle。
5 . hilo:Hibernate 中最經常使用的一種生成方式,須要一張額外的表保存 hi 的值。保存 hi 值的表至少有一條記錄(只與第一條記錄有關),不然會出現錯誤。
<id name="id" column="id"> <generator class="hilo"> <param name="table">hibernate_hilo</param> <param name="column">next_hi</param> <param name="max_lo">100</param> </generator> </id> <!-- 指定保存hi值的表名 --> <param name="table">hibernate_hilo</param> <!-- 指定保存hi值的列名 --> <param name="column">next_hi</param> <!-- 指定低位的最大值 --> <param name="max_lo">100</param> <!-- 也能夠省略table和column配置,其默認的表爲hibernate_unique_key,列爲next_hi --> <id name="id" column="id"> <generator class="hilo"> <param name="max_lo">100</param> </generator> </id>hilo生成器生成主鍵的過程(以hibernate_unique_key表,next_hi 列爲例):
- 得到hi值:讀取並記錄數據庫的hibernate_unique_key表中next_hi字段的值,數據庫中此字段值加1保存。
- 得到lo值:從0到max_lo循環取值,差值爲1,當值爲max_lo值時,從新獲取hi值,而後lo值繼續從0到max_lo循環。
- 根據公式 hi * (max_lo + 1) + lo計算生成主鍵值。
注意:當hi值是0的時候,那麼第一個值不是0*(max_lo+1)+0=0,而是lo跳過0從1開始,直接是一、二、3……
那max_lo配置多大合適呢?
這要根據具體狀況而定,若是系統通常不重啓,並且須要用此表創建大量的主鍵,能夠吧max_lo配置大一點,這樣能夠減小讀取數據表的次數,提升效率;反之,若是服務器常常重啓,能夠吧max_lo配置小一點,能夠避免每次重啓主鍵之間的間隔太大,形成主鍵值主鍵不連貫。
注:能夠跨數據庫,hilo算法生成的標誌只能在一個數據庫中保持惟一。
6 . native:native由hibernate根據使用的數據庫自行判斷採用identity、hilo、sequence其中一種做爲主鍵生成方式,靈活性很強。若是能支持identity則使用identity,若是支持sequence則使用sequence。
注:根據數據庫自動選擇,項目中若是用到多個數據庫時,可使用這種方式,使用時須要設置表的自增字段或創建序列,創建表等。
7 . foreign:用於一對一關聯關係中。
<id name="id" column="id"> <generator class="foreign"> <param name="property">user</param> </generator> </id> <one-to-one name="user" class="com.msym.domain.User" constrained="true" />注:用的少,只用於一對一關聯關係【一對一關聯關係通常都合爲一張表】。
小總結:
主鍵生成策略 |
由誰生成OID |
數據庫id字段類型 |
兼容數據庫 |
assigned |
程序員控制輸入 |
不限定 |
全部 |
uuid |
Hibernate內部控制輸入 |
字符串類型 |
全部 |
increment |
Hibernate內部控制輸入 |
整型 |
全部 |
identity |
數據庫底層控制輸入 |
整型自增 |
Mysql可用 |
sequence |
數據庫底層控制輸入 |
整型 |
Oracle可用 |
native |
數據庫底層控制輸入 |
整型自增 |
全部 |