您好,登錄后才能下訂單哦!
在數(shù)據(jù)庫中區(qū)分兩條數(shù)據(jù)是否是同一條,靠的是主鍵pk
在jvm中,有一塊內(nèi)存區(qū)域叫hibernate內(nèi)存,jvm中并hibernate內(nèi)存外面是可以存在多個(gè)相同的對(duì)象的,區(qū)分兩個(gè)對(duì)象是否是同一個(gè)對(duì)象靠的是地址(object中的equals方法,)在hibernate內(nèi)存中靠的是什么呢?
oid對(duì)象唯一標(biāo)示符
oid的使用原則:讓hibernate使用數(shù)據(jù)庫的能力去維護(hù)
Hibernate中定義的主鍵類型包括:自然主鍵和代理主鍵:
自然主鍵:具有業(yè)務(wù)含義 字段 作為主鍵,比如:學(xué)號(hào)、×××號(hào)
代理主鍵:不具有業(yè)務(wù)含義 字段作為主鍵(例如 自增id),比如:mysql自增主鍵,oracle序列生成的主鍵、uuid()方法生成的唯一序列串
我一般采用代理主鍵
在hbm.xml中可以設(shè)置的主鍵生成策略如下:
increment 代理主鍵。
由hibernate維護(hù)一個(gè)變量,每次生成主鍵時(shí)自動(dòng)以遞增。
問題:如果有多個(gè)應(yīng)用訪問一個(gè)數(shù)據(jù)庫,由于每個(gè)應(yīng)用維護(hù)自己的主鍵,所以此時(shí)主鍵可能沖突。建議不采用。
hibernate會(huì)先去數(shù)據(jù)庫查詢主鍵是多少,然后再自增,然后給實(shí)體類賦值,在去插入,這樣就會(huì)有線程安全問題,如果兩個(gè)人在同時(shí)插入數(shù)據(jù),那么很有可能,有一個(gè)人插入失敗
identity 代理主鍵。
由底層數(shù)據(jù)庫生成表識(shí)符。條件是數(shù)據(jù)庫支持自動(dòng)增長(zhǎng)數(shù)據(jù)類型。比如:mysql的自增主鍵,oracle不支持主鍵自動(dòng)生成。
如果數(shù)據(jù)庫支持自增建議采用。
sequence 代理主鍵。
Hibernate根據(jù)底層數(shù)據(jù)庫序列生成標(biāo)識(shí)符。條件是數(shù)據(jù)庫支持序列。比如oracle的序列。
如果數(shù)據(jù)庫支持序列建議采用。
native 代理主鍵。
根據(jù)底層數(shù)據(jù)庫對(duì)自動(dòng)來選擇identity、sequence、hilo
由于生成主鍵策略的控制權(quán)由hibernate控制,所以不建議采用。
uuid 代理主鍵。
Hibernate采用128位的UUID算法來生成標(biāo)識(shí)符。該算法
能夠在網(wǎng)絡(luò)環(huán)境中生成唯一的字符串標(biāo)識(shí)符。
此策略可以保證生成主鍵的唯一性,并且提供了最好的數(shù)據(jù)庫插入性能和數(shù)據(jù)庫平臺(tái)的無關(guān)性。
建議采用。
assigned 自然主鍵。
由java程序負(fù)責(zé)生成標(biāo)識(shí)符。
不建議采用。
hilo 代理主鍵。
使用高低位算法生成主鍵。必須是long、int、short類型。該算法生成的標(biāo)識(shí)符只能在一個(gè)數(shù)據(jù)庫中保證唯一。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。