主键由数据库mysql 映射native_Hibernate主键生成策略详解
轉(zhuǎn)載自:http://blog.csdn.net/wanghuan203/article/details/7562395
hibernate提供的主鍵生成策略,使我們可以在實(shí)體類(lèi)的映射xml文件中設(shè)定關(guān)鍵字來(lái)告訴hibernate我們要使用的主鍵生成方式,然后hibernate會(huì)根據(jù)設(shè)定完成數(shù)據(jù)庫(kù)的主鍵控制。
一、首先通過(guò)舉例子來(lái)了解實(shí)體映射文件(*.hbm.xml)中對(duì)id生成策略配置格式
用戶(hù)User的實(shí)體類(lèi)User.Java
User.java對(duì)應(yīng)的映射文件User.hbm.xml
其中
二、Hibernate常用的主鍵生成策略的原理、特點(diǎn)、應(yīng)用場(chǎng)合
關(guān)于映射文件的問(wèn)題下次再介紹,這次主要總結(jié)hibernate常用主鍵生成策略。
(1)increment
a)對(duì)主鍵值采取自動(dòng)順序增長(zhǎng)的方式生成新的主鍵,值默認(rèn)從1開(kāi)始。
b)原理:在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存當(dāng)前最大值,之后每次需要生成主鍵值的時(shí)候?qū)⒋酥导?作為主鍵.不依賴(lài)于底層的數(shù)據(jù)庫(kù),因此所有的數(shù)據(jù)庫(kù)都可以使用
c)缺點(diǎn):通過(guò)increment的生成主鍵的原理可推斷,此種主鍵生成策略不適用于集群、同一時(shí)段大量用戶(hù)并發(fā)訪(fǎng)問(wèn)的系統(tǒng),既當(dāng)大量用戶(hù)同一時(shí)間段同時(shí)進(jìn)行插入操作的時(shí)候,可能存在取得相同的最大值然后再同時(shí)+1的情況,這個(gè)時(shí)候就會(huì)造成主鍵沖突。因此,如果同一數(shù)據(jù)庫(kù)有多個(gè)實(shí)例訪(fǎng)問(wèn),此方式必須避免使用。
(2)UUID
a)原理UUID使用128位UUID算法生成主鍵,能夠保證網(wǎng)絡(luò)環(huán)境下的主鍵唯一性,也就能夠保證在不同數(shù)據(jù)庫(kù)及不同服務(wù)器下主鍵的唯一性。所以使用于所有數(shù)據(jù)庫(kù)。
b)特點(diǎn);能夠保證數(shù)據(jù)庫(kù)中的主鍵唯一性,但是在生成的主鍵占用比較多的存貯空間
(3)Hilo
a)原理:通過(guò)hi/lo 算法(Hilo使用高低位算法生成主鍵,高低位算法使用一個(gè)高位值和一個(gè)低位值,然后把算法得到的兩個(gè)值拼接起來(lái))實(shí)現(xiàn)的主鍵生成機(jī)制,需要額外的數(shù)據(jù)庫(kù)表保存主鍵生成歷史狀態(tài)。
b)特點(diǎn):需要額外的數(shù)據(jù)庫(kù)表和字段提供高位值來(lái)源。默認(rèn)情況下使用的表是 hibernate_unique_key,默認(rèn)字段叫作next_hi。next_hi必須有一條記錄否則會(huì)出現(xiàn)錯(cuò)誤。需要額外的數(shù)據(jù)庫(kù)表的支持,能保證同一個(gè)數(shù)據(jù)庫(kù)中主鍵的唯一性,但不能保證多個(gè)數(shù)據(jù)庫(kù)之間主鍵的唯一性。Hilo主鍵生成方式由Hibernate 維護(hù),所以Hilo方式與底層數(shù)據(jù)庫(kù)無(wú)關(guān)。
(4)sequence
a)sequence實(shí)際是就是一張單行單列的表。
b)實(shí)現(xiàn)原理:調(diào)用數(shù)據(jù)庫(kù)中底層存在的sequence生成主鍵,需要底層數(shù)據(jù)庫(kù)的支持序列,因此他是依賴(lài)于數(shù)據(jù)庫(kù)的。
c)支持sequence的數(shù)據(jù)庫(kù)有:Oracle?、DB2(MySQL/SQlServer不支持)、PostgreSql、SAPDb等
(5)identity
a)根據(jù)底層數(shù)據(jù)庫(kù),來(lái)支持自動(dòng)增長(zhǎng),不同的數(shù)據(jù)庫(kù)用不同的主鍵增長(zhǎng)方式。
b)特點(diǎn): 與底層數(shù)據(jù)庫(kù)有關(guān),要求數(shù)據(jù)庫(kù)支持Identity,如MySQl中是auto_increment, SQL Server 中是Identity。支持的數(shù)據(jù)庫(kù)有MySql、SQL Server、DB2、Sybase和HypersonicSQL。
c)好處:在建表的時(shí)候指定了id為自動(dòng)增長(zhǎng),實(shí)際開(kāi)發(fā)中就不需要自己定義插入數(shù)據(jù)庫(kù)的主鍵值,系統(tǒng)會(huì)自動(dòng)順序遞增一個(gè)值 。Identity無(wú)需Hibernate和用戶(hù)的干涉,使用較為方便,但由于依賴(lài)于數(shù)據(jù)庫(kù),所以不便于在不同的數(shù)據(jù)庫(kù)之間移植程序。
(6)native
a)作用:根據(jù)數(shù)據(jù)庫(kù)的類(lèi)型,自動(dòng)在sequence 、identity和,hilo進(jìn)行切換。
b)實(shí)現(xiàn)自動(dòng)切換的依據(jù):根據(jù)Hibernate配置文件中的方言來(lái)判斷是Oracle還是Mysql、SqlServer,然后針對(duì)數(shù)據(jù)庫(kù)的類(lèi)型抉擇 sequence還是identity作為主鍵生成策略。
c)用處:由于Hibernate會(huì)根據(jù)底層數(shù)據(jù)庫(kù)采用不同的映射方式,因此靈活性高,便于程序移植,項(xiàng)目中如果用到多個(gè)數(shù)據(jù)庫(kù)時(shí),可以使用這種方式。
(7)assigned
a)作用:用于手工分配主鍵生成器,一旦指定為這個(gè)了,Hibernate就不在自動(dòng)為程序做主鍵生成器了。沒(méi)有指定標(biāo)簽時(shí),默認(rèn)就是assigned主鍵的生成方式
b)使用方法:在程序中session.save();之前,由程序員自己指定主鍵值為多少。
例如:user.setId(1);這就是在程序中程序員手動(dòng)為用戶(hù)表指定主鍵值為1。
(8)foreign
只適用基于共享主鍵的一對(duì)一關(guān)聯(lián)映射的時(shí)候使用。即一個(gè)對(duì)象的主鍵是參照的另一張表的主鍵生成的。
對(duì)數(shù)據(jù)庫(kù)的依賴(lài)性總結(jié)
UUID,increment、Hilo、assigned:對(duì)數(shù)據(jù)庫(kù)無(wú)依賴(lài)
identity:依賴(lài)Mysql或sql server,主鍵值不由hibernate維護(hù)
sequence:適合于oracle等支持序列的dbms,主鍵值不由hibernate維護(hù),由序列產(chǎn)生。
native:根據(jù)底層數(shù)據(jù)庫(kù)的具體特性選擇適合的主鍵生成策略,如果是mysql或sqlserver,選擇identity,如果是oracle,選擇sequence。
關(guān)于主鍵生成策略的選擇:
一般來(lái)說(shuō)推薦UUID,因?yàn)樯芍麈I唯一,且對(duì)數(shù)據(jù)庫(kù)無(wú)依賴(lài),可移植性強(qiáng)。
由于常用的數(shù)據(jù)庫(kù),如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主鍵生成機(jī)制(Auto-Increase 字段或者Sequence)。我們可以在數(shù)據(jù)庫(kù)提供的主鍵生成機(jī)制上,采用native,sequence或者identity的主鍵生成方式。
不過(guò)值得注意的是,一些數(shù)據(jù)庫(kù)提供的主鍵生成機(jī)制在效率上未必最佳大量并發(fā)insert數(shù)據(jù)時(shí)可能會(huì)引起表之間的互鎖。
因此,對(duì)于并發(fā)Insert要求較高的系統(tǒng),推薦采用uuid作為主鍵生成機(jī)制。
總之,hibernate主鍵生成器選擇,還要具體情況具體分析。一般而言,利用uuid方式生成主鍵將提供最好的性能和數(shù)據(jù)庫(kù)平臺(tái)適應(yīng)性。
總結(jié)
以上是生活随笔為你收集整理的主键由数据库mysql 映射native_Hibernate主键生成策略详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 风暴航路的地图编号_砖厂风暴航路已倒闭,
- 下一篇: mysql设计经纬度表_MySQL经纬度