全面講解Hibernate主鍵
Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹Hibernate主鍵,包括介紹Assigned方式、Increment方式和Foreign GUID等方面。
Hibernate主鍵介紹
1.Assigned
Assigned方式由程序生成主鍵值,并且要在save()之前指定否則會(huì)拋出異常
特點(diǎn):主鍵的生成值完全由用戶決定,與底層數(shù)據(jù)庫(kù)無(wú)關(guān)。用戶需要維護(hù)主鍵值,在調(diào)用session.save()之前要指定主鍵值。
2.Hilo
Hilo使用高低位算法生成主鍵,高低位算法使用一個(gè)高位值和一個(gè)低位值,然后把算法得到的兩個(gè)值拼接起來(lái)作為數(shù)據(jù)庫(kù)中的***主鍵。Hilo方式需要額外的數(shù)據(jù)庫(kù)表和字段提供高位值來(lái)源。默認(rèn)請(qǐng)況下使用的表是
hibernate_unique_key,默認(rèn)字段叫作next_hi。next_hi必須有一條記錄否則會(huì)出現(xiàn)錯(cuò)誤。
特點(diǎn):需要額外的數(shù)據(jù)庫(kù)表的支持,能保證同一個(gè)數(shù)據(jù)庫(kù)中主鍵的***性,但不能保證多個(gè)數(shù)據(jù)庫(kù)之間主鍵的***性。Hilo主鍵生成方式由Hibernate 維護(hù),所以Hilo方式與底層數(shù)據(jù)庫(kù)無(wú)關(guān),但不應(yīng)該手動(dòng)修改hi/lo算法使用的表的值,否則會(huì)引起主鍵重復(fù)的異常。
3.Increment
Increment方式對(duì)主鍵值采取自動(dòng)增長(zhǎng)的方式生成新的主鍵值,但要求底層數(shù)據(jù)庫(kù)的支持Sequence。如Oracle,DB2等。需要在映射文件xxx.hbm.xml中加入Increment標(biāo)志符的設(shè)置。
特點(diǎn):由Hibernate本身維護(hù),適用于所有的數(shù)據(jù)庫(kù),不適合多進(jìn)程并發(fā)更新數(shù)據(jù)庫(kù),適合單一進(jìn)程訪問(wèn)數(shù)據(jù)庫(kù)。不能用于群集環(huán)境。
4.Identity
Identity當(dāng)時(shí)根據(jù)底層數(shù)據(jù)庫(kù),來(lái)支持自動(dòng)增長(zhǎng),不同的數(shù)據(jù)庫(kù)用不同的主鍵增長(zhǎng)方式。
特點(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。 Identity無(wú)需Hibernate和用戶的干涉,使用較為方便,但不便于在不同的數(shù)據(jù)庫(kù)之間移植程序。
5.Sequence
Sequence需要底層數(shù)據(jù)庫(kù)支持Sequence方式,例如Oracle數(shù)據(jù)庫(kù)等
特點(diǎn):需要底層數(shù)據(jù)庫(kù)的支持序列,支持序列的數(shù)據(jù)庫(kù)有DB2、PostgreSql、Qracle、SAPDb等在不同數(shù)據(jù)庫(kù)之間移植程序,特別從支持序列的數(shù)據(jù)庫(kù)移植到不支持序列的數(shù)據(jù)庫(kù)需要修改配置文件
6.Native
Native主鍵生成方式會(huì)根據(jù)不同的底層數(shù)據(jù)庫(kù)自動(dòng)選擇Identity、Sequence、Hilo主鍵生成方式。
特點(diǎn):根據(jù)不同的底層數(shù)據(jù)庫(kù)采用不同的主鍵生成方式。由于Hibernate會(huì)根據(jù)底層數(shù)據(jù)庫(kù)采用不同的映射方式,因此便于程序移植,項(xiàng)目中如果用到多個(gè)數(shù)據(jù)庫(kù)時(shí),可以使用這種方式。
7.UUID
UUID使用128位UUID算法生成主鍵,能夠保證網(wǎng)絡(luò)環(huán)境下的主鍵***性,也就能夠保證在不同數(shù)據(jù)庫(kù)及不同服務(wù)器下主鍵的***性。
特點(diǎn);能夠保證數(shù)據(jù)庫(kù)中的主鍵***性,生成的主鍵占用比較多的存貯空間
8.Foreign GUID
Foreign用于一對(duì)一關(guān)系中。GUID主鍵生成方式使用了一種特殊算法,保證生成主鍵的***性,支持SQL Server和MySQL。以上介紹Hibernate主鍵。
【編輯推薦】