Hibernate提供的内置标识符生成器
Hibernate提供的內(nèi)置標(biāo)識符生成器
?Java語言按內(nèi)存地址來識別或區(qū)分同一個類的不同對象,而關(guān)系數(shù)據(jù)庫按主鍵來識別或區(qū)分同一個表的不同記錄。Hibernate使用OID(對象標(biāo)識符)來統(tǒng)一兩者之間的矛盾,OID是關(guān)系數(shù)據(jù)庫中的主鍵(通常稱為代理主健)在Java對象模型中的等價物。
在對象-關(guān)系映射文件中,<id>元素用來設(shè)置對象標(biāo)識符,比如:
????????<id?name="id"?type="java.lang.Integer">
????????????<column?name="ID"?/>
??????????<generator?class="identity"?/>
????????</id>
<generator>元素用來設(shè)定標(biāo)識生成器。Hibernate提供了標(biāo)識符生成器接口:?org.hibernate.id.IdentifierGenerator接口;并且提供了多種內(nèi)置的實現(xiàn)。例如:?org.hibernate.id.IdentityGenerator;org.hibernate.id.IncrementGenerator;它們的縮寫名分別為:identity和increment。在設(shè)置<generator>子元素的class屬性時,既可以提供完整的標(biāo)識符生成器的類名,也可以給定縮寫名,因此以下兩種方式是等價的。
????????<id?name="id"?type="java.lang.Integer">
????????????<column?name="ID"?/>
????????????<generator?class="org.hibernate.id.IdentityGenerator"?/>
????????</id>
或者:
????????<id?name="id"?type="java.lang.Integer">
????????????<column?name="ID"?/>
??????????<generator?class="identity"?/>
????????</id>
| 標(biāo)識符生成器 | 說?????????明 |
| increment?? | ????適用于代理主鍵。由Hibernate自動以遞增的方式生成標(biāo)識符,每次增加1。 |
| identity? | 適用于代理主鍵。由底層數(shù)據(jù)庫生成標(biāo)識符。前提條件是底層數(shù)據(jù)庫支持自動增長字段類型。(oracle數(shù)據(jù)庫不能用它) |
| sequence | 適用于代理主鍵。Hibernate根據(jù)底層數(shù)據(jù)庫的序列來生成標(biāo)識符。前提條件是底層數(shù)據(jù)庫支持序列。(oracle數(shù)據(jù)庫能用它) |
| hilo? | 適用于代理主鍵。Hibernate根據(jù)high/low算法來生成標(biāo)識符。Hibernate把特定表的字段作為"high"值.在默認(rèn)情況下選用hibernate_unique_key表的next_hi字段。它的機制不依賴于底層數(shù)據(jù)庫系統(tǒng),因此它適合于所有的數(shù)據(jù)庫系統(tǒng)。high/low算法生成的標(biāo)識符只能在一個數(shù)據(jù)庫中保證唯一。 |
| native | 適用于代理主鍵。根據(jù)底層數(shù)據(jù)庫對自動生成標(biāo)識符的支持能力,來選擇identity,sequence,?hilo。很適合于跨平臺開發(fā),即同一個Hibernate應(yīng)用需要連接多種數(shù)據(jù)庫系統(tǒng)。 |
| uuid.hex | 適用于代理主鍵。Hibernate采用128位的UUID算法來生成標(biāo)識符。UUID算法能夠在網(wǎng)絡(luò)環(huán)境中生成唯一的字符串標(biāo)識符。這種標(biāo)識符生成策略并不流行,因為字符串類型的主鍵比整數(shù)類型的主鍵占用更多的數(shù)據(jù)庫空間。 |
| assigned | 適用于自然主鍵。由Java應(yīng)用程序負(fù)責(zé)生成標(biāo)識符,為了能讓Java應(yīng)用程序設(shè)置OID,不能把setID()方法聲明為private類型,應(yīng)該盡量避免使用自然主鍵。 |
1?代理主鍵:
? 注意:?不具有義務(wù)含義,所以它可以適應(yīng)不斷變化的業(yè)務(wù)需求,它通常為整數(shù)類型,比如short、long、int,以及它們的包裝類型。
2?自然主鍵:
?具有業(yè)務(wù)含義。
3?幾種常用數(shù)據(jù)庫系統(tǒng)中可使用的標(biāo)識符生成器:
MYSQL:identity、increment、hiho、native
MS SQL Server:identity、increment、hiho、native
Oracle:sequence、identity、increment、hiho、native
跨平臺開發(fā):native
?幾個例子:
?
1、如果主鍵字段為自增類型,
那么對應(yīng)的.hbm.xml文件中的id字段的xml聲明,
應(yīng)該這么寫:
<generator class="native" />
例如:
<id
column="user_id"
name="Id"
type="integer"
>
<generator class="native" />
</id>
其實這個native并非實際的類型,而是hiberante根據(jù)
當(dāng)前使用的數(shù)據(jù)庫,自動使用對應(yīng)的類型。
例如:如果sqlserver,native就對應(yīng)identity
見Hiberante參考:
native(本地)
根據(jù)底層數(shù)據(jù)庫的能力選擇identity, sequence?或者h(yuǎn)ilo中的一個。
?
2、如果主鍵字段不設(shè)置為自增,但是int型的,
可以使用increment,由hibernate產(chǎn)生主鍵。
<generator class="increment" />
不過這種方法,對于并發(fā)量大的應(yīng)用,似乎最好不要采用。
見hiberante參考:
increment(遞增)
用于為long, short或者int類型生成唯一標(biāo)識。只有在沒有其他進(jìn)程往同一張表中插入數(shù)據(jù)時才能使用。?
在集群下不要使用。
?
3、如果使用uuid.hex產(chǎn)生的隨機32位數(shù)最為主鍵,
那么數(shù)據(jù)庫的id字段類型為char,長度為32
hbm.xml中寫為:?<generator class="uuid.hex" />
另外,uuid.string也是功能類似。
uuid.hex產(chǎn)生的是32位的16進(jìn)制數(shù)字的字符串。
而uuid.string產(chǎn)生的是16個字符長的任意ASCII字符組成的字符串
見參考:
uuid.hex
用一個128-bit的UUID算法生成字符串類型的標(biāo)識符。在一個網(wǎng)絡(luò)中唯一(使用了IP地址)。UUID被編碼為一個32位16進(jìn)制數(shù)字的字符串。?
uuid.string
使用同樣的UUID算法。UUID被編碼為一個16個字符長的任意ASCII字符組成的字符串。不能使用在PostgreSQL數(shù)據(jù)庫中
?
轉(zhuǎn)載于:https://www.cnblogs.com/hq-123/p/5831264.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Hibernate提供的内置标识符生成器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android应用连接代理服务器状况监测
- 下一篇: Maven的作用总结