映射對(duì)象標(biāo)識(shí)符_第1頁(yè)
映射對(duì)象標(biāo)識(shí)符_第2頁(yè)
映射對(duì)象標(biāo)識(shí)符_第3頁(yè)
映射對(duì)象標(biāo)識(shí)符_第4頁(yè)
映射對(duì)象標(biāo)識(shí)符_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、映射對(duì)象標(biāo)識(shí)符1主要內(nèi)容2介紹Java語(yǔ)言、Hibernate如何識(shí)別對(duì)象以及關(guān)系數(shù)據(jù)庫(kù)識(shí)別不同的記錄。Hibernate提供的幾種內(nèi)置標(biāo)識(shí)符成生器的用法。2關(guān)系數(shù)據(jù)庫(kù)按主鍵區(qū)分不同的記錄在關(guān)系數(shù)據(jù)庫(kù)表中,用主鍵來(lái)識(shí)別記錄并保證每條記錄的唯一性。作為主鍵的字段必須滿足以下條件:不允許為null。每條記錄具有唯一的主鍵值,不允許主鍵值重復(fù)。每條記錄的主鍵值永遠(yuǎn)不會(huì)改變。主鍵字段一般取名為ID,常為整型類(lèi)型。3關(guān)系數(shù)據(jù)庫(kù)按主鍵區(qū)分不同的記錄把主鍵定義為自動(dòng)增長(zhǎng)標(biāo)識(shí)符類(lèi)型在MySQL中,如果把表的主鍵設(shè)為auto_increment類(lèi)型,數(shù)據(jù)庫(kù)會(huì)自動(dòng)為主鍵賦值: ID int auto_increm

2、ent primary key not null 在MS SQL Server中,如果把表的主鍵設(shè)為identity類(lèi)型,數(shù)據(jù)庫(kù)會(huì)自動(dòng)為主鍵賦值。 ID int identity(1,1) primary key not null 4關(guān)系數(shù)據(jù)庫(kù)按主鍵區(qū)分不同的記錄從序列(Sequence)中獲取自動(dòng)增長(zhǎng)的標(biāo)識(shí)符在Oracle數(shù)據(jù)庫(kù)系統(tǒng)中,可以為每張表的主鍵創(chuàng)建一個(gè)單獨(dú)的序列,然后從這個(gè)序列中獲得自動(dòng)增加的標(biāo)識(shí)符,把它賦值給主鍵。 例如,以下語(yǔ)句創(chuàng)建了一個(gè)名為CUSTOMERS_ID_SEQ的序列,這個(gè)序列的起始值為1,增量為2。 create sequence CUSTOMERS_ID_SEQ

3、 increment by 2 start with 1 一旦定義了序列,就可以訪問(wèn)序列的curval(序列的當(dāng)前值)和nextval(先增加序列的值,然后返回增加后的序列值)屬性。 create table TABLE1( ID int primary key not null, NAME varchar(15);insert into TABLE1 values(CUSTOMERS_ID_SEQ.curval, Tom);insert into TABLE1 values(CUSTOMERS_ID_SEQ.nextval, Mike);select ID, NAME from TABLE1

4、 ID NAME 1 Tom 3 Mike5Java語(yǔ)言按內(nèi)存地址區(qū)分不同的對(duì)象在Java語(yǔ)言中,判斷兩個(gè)對(duì)象引用變量是否相等,有以下兩種比較方式比較兩個(gè)變量所引用的對(duì)象的內(nèi)存地址是否相同,“=”運(yùn)算符就是比較的內(nèi)存地址。此外,在Object類(lèi)中定義的equals(Object o)方法,也是按內(nèi)存地址來(lái)比較的。Customers c1 = new Customers(Tom);Customers c2 = new Customers(Tom);Customers c3 = c1; c3.setName(Mike);TomTomc1c2c3MikeTomc1c2c36Java語(yǔ)言按內(nèi)存地址區(qū)分

5、不同的對(duì)象在Java語(yǔ)言中,判斷兩個(gè)對(duì)象引用變量是否相等,有以下兩種比較方式比較兩個(gè)變量所引用的對(duì)象的值是否相同,Java API中的一些類(lèi)覆蓋了Object類(lèi)的equals(Object o)方法,實(shí)現(xiàn)按對(duì)象值比較。這些類(lèi)包括:String類(lèi)、Date類(lèi)以及Java包裝類(lèi) String s1 = new String(hello); String s2 = new String(hello); s1= s2 - false s1.equals(s2) - true7Java語(yǔ)言按內(nèi)存地址區(qū)分不同的對(duì)象在Java語(yǔ)言中,判斷兩個(gè)對(duì)象引用變量是否相等,有以下兩種比較方式用戶自定義的類(lèi)也可以覆蓋O

6、bject類(lèi)的equals(Object o)方法,從而實(shí)現(xiàn)按對(duì)象值比較。例如,在Customers類(lèi)中添加equals(Object o)方法,使它按客戶的姓名來(lái)比較兩個(gè)Customers對(duì)象是否相等。 public boolean equals(Object o) if(this = o ) return ture; if( !o instanceof Customers) return false; final Customers other = (Customers) o; if(this.getName().equals(other.getName() return true; re

7、turn false; Customers c1 = new Customers (Tom); Customers c2 = new Customers (Tom); c1= c2 - false c1.equals(c2) - true8Hibernate用對(duì)象標(biāo)識(shí)符來(lái)區(qū)分對(duì)象由于關(guān)系數(shù)據(jù)庫(kù)和Java語(yǔ)言區(qū)分對(duì)象的方式不統(tǒng)一。Hibernate通過(guò)使用對(duì)象標(biāo)識(shí)符OID來(lái)解決兩者之間的矛盾OID是關(guān)系數(shù)據(jù)庫(kù)中的主鍵(通常為代理主鍵)在Java對(duì)象模型中的等價(jià)物。在運(yùn)行時(shí),Hibernate根據(jù)OID來(lái)維持Java對(duì)象和數(shù)據(jù)庫(kù)表中記錄的對(duì)應(yīng)關(guān)系。9Hibernate用對(duì)象標(biāo)識(shí)符來(lái)區(qū)分對(duì)象Tran

8、saction tx = session.beginTransacton(); Customers c1 = (Customers)session.get( Customers.class,new Long(1); Customers c2 = (Customers)session.get( Customers.class,new Long(1); Customers c3 = (Customers)session.get( Customers.class,new Long(3); System.out.println(c1=c2); System.out.println(c1=c3); mi

9、t();10Hibernate用對(duì)象標(biāo)識(shí)符來(lái)區(qū)分對(duì)象與表的代理主鍵對(duì)應(yīng),OID也是整型類(lèi)型,Hibernate允許在持久化類(lèi)中把OID定義為這些整型類(lèi)型:short(Short)、int(Integer)、long(Long)為了保證持久化對(duì)象的OID的唯一性和不可變性,通常由Hiberante或底層數(shù)據(jù)庫(kù)來(lái)給OID賦值。因此,可以把持久化類(lèi)的OID的setId()方法設(shè)為private類(lèi)型,以禁止Java應(yīng)用程序隨便修改OID。getId()設(shè)為public類(lèi)型。在對(duì)象-關(guān)系映射文件中,元素用來(lái)設(shè)置對(duì)象標(biāo)識(shí)符: 11Hibernate內(nèi)置標(biāo)識(shí)符生成器increment標(biāo)識(shí)符生成器以遞增的方式

10、由Hibernate自行生成標(biāo)識(shí)符屬性值,增量為1。(首先取得最大的主鍵值)適用范圍:OID必須為short、int和long數(shù)據(jù)類(lèi)型以及它們的包裝類(lèi)。不依賴(lài)于數(shù)據(jù)庫(kù)底層實(shí)現(xiàn),適合于所有的數(shù)據(jù)庫(kù)系統(tǒng)。適用于只有單個(gè)Hibernate應(yīng)用進(jìn)程訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù)的場(chǎng)合,在集群環(huán)境下不推薦使用它。12Hibernate內(nèi)置標(biāo)識(shí)符生成器identity標(biāo)識(shí)符生成器適用于代理主鍵,由底層數(shù)據(jù)庫(kù)生成標(biāo)識(shí)符,它要求底層數(shù)據(jù)庫(kù)把主鍵定義為自動(dòng)增長(zhǎng)字段類(lèi)型。適用范圍:依賴(lài)于底層數(shù)據(jù)庫(kù),因此,要求底層數(shù)據(jù)庫(kù)系統(tǒng)必須支持自動(dòng)增長(zhǎng)字段類(lèi)型。數(shù)據(jù)庫(kù)包括:DB2、MySQL、MS SQL Server、Sybase、Inf

11、ormix等。OID必須為short、int和long數(shù)據(jù)類(lèi)型以及它們的包裝類(lèi)。13Hibernate內(nèi)置標(biāo)識(shí)符生成器sequence標(biāo)識(shí)符生成器利用底層數(shù)據(jù)庫(kù)提供的序列來(lái)生成標(biāo)識(shí)符。 tester_id_seq 適用范圍:要求底層數(shù)據(jù)庫(kù)系統(tǒng)必須支持序列。數(shù)據(jù)庫(kù)包括:DB2、Oracle、SAP DB、PostgreSQL等。OID必須為short、int和long數(shù)據(jù)類(lèi)型以及它們的包裝類(lèi)。14Hibernate內(nèi)置標(biāo)識(shí)符生成器hilo標(biāo)識(shí)符生成器由Hibernate按照一種high/low(高低位方式)算法來(lái)生成標(biāo)識(shí)符,它從數(shù)據(jù)庫(kù)的特定表的字段中獲取high值。 hi_value next_

12、value 100 /指定低位的最大值 15Hibernate內(nèi)置標(biāo)識(shí)符生成器hilo標(biāo)識(shí)符生成器也可以省略table和column配置,其默認(rèn)的表為hibernate_unique_key,列為next_hi。hilo生成器生成主鍵的過(guò)程(以hibernate_unique_key表,next_hi列為例):獲得hi值:讀取并記錄數(shù)據(jù)庫(kù)的hibernate_unique_key表中next_hi字段的值,數(shù)據(jù)庫(kù)中此字段值加1保存。獲得lo值:從0到max_lo循環(huán)取值,差值為1,當(dāng)值為max_lo值時(shí),重新獲取hi值,然后lo值繼續(xù)從0到max_lo循環(huán)。根據(jù)公式 hi * (max_lo

13、+ 1) + lo計(jì)算生成主鍵值。16Hibernate內(nèi)置標(biāo)識(shí)符生成器hilo標(biāo)識(shí)符生成器注意:當(dāng)hi值是0的時(shí)候,那么第一個(gè)值不是0*(max_lo+1)+0=0,而是lo跳過(guò)0從1開(kāi)始,直接是1、2、3。那max_lo配置多大合適呢?這要根據(jù)具體情況而定,如果系統(tǒng)一般不重啟,而且需要用此表建立大量的主鍵,可以吧max_lo配置大一點(diǎn),這樣可以減少讀取數(shù)據(jù)表的次數(shù),提高效率;反之,如果服務(wù)器經(jīng)常重啟,可以吧max_lo配置小一點(diǎn),可以避免每次重啟主鍵之間的間隔太大,造成主鍵值主鍵不連貫。特點(diǎn):跨數(shù)據(jù)庫(kù),hilo算法生成的標(biāo)志只能在一個(gè)數(shù)據(jù)庫(kù)中保證唯一。17Hibernate內(nèi)置標(biāo)識(shí)符生成器

14、native標(biāo)識(shí)符生成器依據(jù)底層數(shù)據(jù)庫(kù)對(duì)自動(dòng)生成標(biāo)識(shí)符的支持能力,來(lái)選擇使用identity、sequence或hilo標(biāo)識(shí)符生成器。native能自動(dòng)判斷底層數(shù)據(jù)庫(kù)提供的生成標(biāo)識(shí)符的機(jī)制。 適用范圍:適合于跨數(shù)據(jù)庫(kù)平臺(tái)開(kāi)發(fā),即同一個(gè)Hibernate應(yīng)用需要連接多種數(shù)據(jù)庫(kù)系統(tǒng)的場(chǎng)合。OID必須為short、int和long數(shù)據(jù)類(lèi)型以及它們的包裝類(lèi)。18Hibernate內(nèi)置標(biāo)識(shí)符生成器assigned標(biāo)識(shí)符生成器由應(yīng)用程序負(fù)責(zé)生成主鍵標(biāo)識(shí)符,往往使用在數(shù)據(jù)庫(kù)中沒(méi)有代理主鍵,使用的主鍵與業(yè)務(wù)相關(guān)的情況。與Hibernate和底層數(shù)據(jù)庫(kù)都無(wú)關(guān),可以跨數(shù)據(jù)庫(kù)。在存儲(chǔ)對(duì)象前,必須要使用主鍵的sett

15、er方法給主鍵賦值,至于這個(gè)值怎么生成,完全由自己決定,這種方法應(yīng)該盡量避免。 其缺點(diǎn)為在執(zhí)行新增操作時(shí),需查詢數(shù)據(jù)庫(kù)判斷生成的主鍵是否已經(jīng)存在。19Hibernate內(nèi)置標(biāo)識(shí)符生成器uuid標(biāo)識(shí)符生成器UUID:Universally Unique Identifier,是指在一臺(tái)機(jī)器上生成的數(shù)字,它保證對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的。按照開(kāi)放軟件基金會(huì)(OSF)制定的標(biāo)準(zhǔn)計(jì)算,用到了以太網(wǎng)卡地址、納秒級(jí)時(shí)間、芯片ID碼和許多可能的數(shù)字,標(biāo)準(zhǔn)的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)其中每個(gè) x 是 0-9 或 a

16、-f 范圍內(nèi)的一個(gè)十六進(jìn)制的數(shù)字。特點(diǎn):uuid長(zhǎng)度大,占用空間大,跨數(shù)據(jù)庫(kù),不用訪問(wèn)數(shù)據(jù)庫(kù)就生成主鍵值,所以效率高且能保證唯一性,移植非常方便,推薦使用。20Hibernate內(nèi)置標(biāo)識(shí)符生成器guid標(biāo)識(shí)符生成器GUID:Globally Unique Identifier全球唯一標(biāo)識(shí)符,也稱(chēng)作UUID,是一個(gè)128位長(zhǎng)的數(shù)字,用16進(jìn)制表示。算法的核心思想是結(jié)合機(jī)器的網(wǎng)卡、當(dāng)?shù)貢r(shí)間、一個(gè)隨即數(shù)來(lái)生成GUID。從理論上講,如果一臺(tái)機(jī)器每秒產(chǎn)生10000000個(gè)GUID,則可以保證(概率意義上)3240年不重復(fù)。Hibernate在維護(hù)主鍵時(shí),先查詢數(shù)據(jù)庫(kù),獲得一個(gè)uuid字符串,該字符串就是

17、主鍵值,該值唯一,缺點(diǎn)長(zhǎng)度較大,支持?jǐn)?shù)據(jù)庫(kù)有限,優(yōu)點(diǎn)同uuid,跨數(shù)據(jù)庫(kù),但是仍然需要訪問(wèn)數(shù)據(jù)庫(kù)。特點(diǎn):需要數(shù)據(jù)庫(kù)支持查詢uuid,生成時(shí)需要查詢數(shù)據(jù)庫(kù),效率沒(méi)有uuid高,推薦使用uuid。21Hibernate內(nèi)置標(biāo)識(shí)符生成器guid標(biāo)識(shí)符生成器CREATE FUNCTION dbo.fun_getUUID32( newid varchar(36) RETURNS VARCHAR(32)ASBEGINDECLARE id VARCHAR(32);select id=SUBSTRING(newid,1,8) +SUBSTRING(newid,10,4)+SUBSTRING(newid,15,

18、4)+ SUBSTRING(newid,20,4)+SUBSTRING(newid,25,12)RETURN idENDselect dbo.fun_getUUID32(NEWID(); 22Hibernate內(nèi)置標(biāo)識(shí)符生成器聯(lián)合主鍵映射如果一張表中存在聯(lián)合主鍵,在hibernate中會(huì)把聯(lián)合主鍵封裝成一個(gè)類(lèi),然后在實(shí)體類(lèi)中引用此聯(lián)合主鍵類(lèi)。聯(lián)合主鍵類(lèi)需要實(shí)現(xiàn)序列化,重寫(xiě)equals以及hashcode方法。create table student( name varchar(20), phone int, age int, constraint STUDENTKEY primary key(name,phone)23Hibernate內(nèi)置標(biāo)識(shí)符生成器聯(lián)合主鍵映射1. 類(lèi)中的每個(gè)主鍵屬性都對(duì)應(yīng)到數(shù)據(jù)表中的每個(gè)主鍵列。Hibernate要求具有聯(lián)合主鍵的實(shí)體類(lèi)實(shí)現(xiàn)S

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論