Hibernate 默認總共支持 13 種生成策略 :
1. increment 2. identity 3. sequence
4. hilo 5. seqhilo 6. uuid
7. uuid.hex 8. guid 9. native
10. assigned 11. select 12. foreign 13. sequence-identity
下面介紹幾個較為常用的策略 :
① identity [ 自然遞增 ]
支持 DB2,MySQL,SQL Server,Sybase 和HypersonicSQL 數(shù)據(jù)庫, 用于為 long 或 short 或 int 類型生成唯一標識。它依賴于底層不同的數(shù)據(jù)庫,
與 Hibernate 和 程序員無關。
注解示例 :
@Id
@GenericGenerator(name = "idGenerator", strategy = "identity")
@GeneratedValue(generator = "idGenerator")
② sequence [ 序列 ]
支持 Oracle,DB2,PostgreSql,SAPDb 等數(shù)據(jù)庫,用于為 long 或 short 或 int 類型生成唯一標識。它需要底層數(shù)據(jù)庫的支持,
并由數(shù)據(jù)庫來維護這個 sequence 序列。
注解示例 :
@Id
@GenericGenerator(name = "idGenerator", strategy = "sequence",
parameters = {@Parameter(name = "sequence",value="seq_name")})
@GeneratedValue(generator = "idGenerator")
注意 : 該策略要求設定序列名,否則 hibernate 將無法找到,這將引致拋出異常 :
org.hibernate.exception.SQLGrammarException: could not get next sequence value
③ native
需底層數(shù)據(jù)庫的支持,對于 MySQL,SQL Server 采用 identity 的生成策略,對于 Oracle,則采用 sequence 策略。
注解示例 :
@Id
@GenericGenerator(name = "idGenerator", strategy = "native")
@GeneratedValue(generator = "idGenerator")
④ increment [ 自然遞增 ]
與 identity 策略不同的是,該策略不依賴于底層數(shù)據(jù)庫,而依賴于 hibernate 本身,用于為 long 或 short 或 int 類型生成唯一標識。
主鍵計數(shù)器是由 hibernate 的一個實例來維護,每次自增量為 1,但在集群下不能使用該策略,
否則將引起主鍵沖突的情況,該策略適用于所有關系型數(shù)據(jù)庫使用。
注解示例 :
@Id
@GenericGenerator(name = "idGenerator", strategy = "increment")
@GeneratedValue(generator = "idGenerator")
⑤ uuid [ 32位16進制數(shù)的字符串 ]
采用128位UUID算法生成主鍵,能夠保證網(wǎng)絡環(huán)境下的主鍵唯一性,也就能夠保證在不同數(shù)據(jù)庫及不同服務器下主鍵的唯一性。
uuid 最終被編碼成一個32位16進制數(shù)的字符串,
占用的存儲空間較大。用于為 String 類型生成唯一標識,適用于所有關系型數(shù)據(jù)庫。
注解示例 :
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
⑤ assigned [ 手工分配主鍵ID值 ]
該策略要求程序員必須自己維護和管理主鍵,當有數(shù)據(jù)需要存儲時,程序員必須自己為該數(shù)據(jù)分配指定一個主鍵ID值,
如果該數(shù)據(jù)沒有被分配主鍵ID值或分配的值存在重復,則該數(shù)據(jù)都將無法被持久化且會引起異常的拋出。
注解示例 :
@Id
@GenericGenerator(name = "idGenerator", strategy = "assigned")
@GeneratedValue(generator = "idGenerator")
posted on 2012-10-12 20:10
fancydeepin 閱讀(12853)
評論(4) 編輯 收藏