日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

主键由数据库mysql 映射native_Hibernate主键生成策略详解

發(fā)布時(shí)間:2025/4/5 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 主键由数据库mysql 映射native_Hibernate主键生成策略详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。