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