




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Hibernate各種主鍵生成策略與配置詳解1、assigned主鍵由外部程序負(fù)責(zé)生成,在 save() 之前必須指定一個(gè)。Hibernate不負(fù)責(zé)維護(hù)主鍵生成。與Hibernate和底層數(shù)據(jù)庫(kù)都無(wú)關(guān),可以跨數(shù)據(jù)庫(kù)。在存儲(chǔ)對(duì)象前,必須要使用主鍵的setter方法給主鍵賦值,至于這個(gè)值怎么生成,完全由自己決定,這種方法應(yīng)該盡量避免。<id name="id" column="id"><generator class="assigned" /></id>“ud”是自定義的策略名,人為起的名字,后面均用“
2、ud”表示。特點(diǎn):可以跨數(shù)據(jù)庫(kù),人為控制主鍵生成,應(yīng)盡量避免。2、increment由Hibernate從數(shù)據(jù)庫(kù)中取出主鍵的最大值(每個(gè)session只取1次),以該值為基礎(chǔ),每次增量為1,在內(nèi)存中生成主鍵,不依賴(lài)于底層的數(shù)據(jù)庫(kù),因此可以跨數(shù)據(jù)庫(kù)。<id name="id" column="id"><generator class="increment" /></id>Hibernate調(diào)用org.hibernate.id.IncrementGenerator類(lèi)里面的generate()方法,使用s
3、elect max(idColumnName) from tableName語(yǔ)句獲取主鍵最大值。該方法被聲明成了synchronized,所以在一個(gè)獨(dú)立的Java虛擬機(jī)內(nèi)部是沒(méi)有問(wèn)題的,然而,在多個(gè)JVM同時(shí)并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)select max時(shí)就可能取出相同的值,再insert就會(huì)發(fā)生Dumplicate entry的錯(cuò)誤。所以只能有一個(gè)Hibernate應(yīng)用進(jìn)程訪問(wèn)數(shù)據(jù)庫(kù),否則就可能產(chǎn)生主鍵沖突,所以不適合多進(jìn)程并發(fā)更新數(shù)據(jù)庫(kù),適合單一進(jìn)程訪問(wèn)數(shù)據(jù)庫(kù),不能用于群集環(huán)境。官方文檔:只有在沒(méi)有其他進(jìn)程往同一張表中插入數(shù)據(jù)時(shí)才能使用,在集群下不要使用。特點(diǎn):跨數(shù)據(jù)庫(kù),不適合多進(jìn)程并發(fā)更新數(shù)據(jù)庫(kù),適
4、合單一進(jìn)程訪問(wèn)數(shù)據(jù)庫(kù),不能用于群集環(huán)境。3、hilohilo(高低位方式high low)是hibernate中最常用的一種生成方式,需要一張額外的表保存hi的值。保存hi值的表至少有一條記錄(只與第一條記錄有關(guān)),否則會(huì)出現(xiàn)錯(cuò)誤??梢钥鐢?shù)據(jù)庫(kù)。<id name="id" column="id"><generator class="hilo"><param name="table">hibernate_hilo</param><param name="
5、column">next_hi</param><param name="max_lo">100</param></generator></id><param name="table">hibernate_hilo</param> 指定保存hi值的表名<param name="column">next_hi</param> 指定保存hi值的列名<param name="max_lo">
6、;100</param> 指定低位的最大值也可以省略table和column配置,其默認(rèn)的表為hibernate_unique_key,列為next_hi<id name="id" column="id"><generator class="hilo"><param name="max_lo">100</param></generator></id>hilo生成器生成主鍵的過(guò)程(以hibernate_unique_key表,next
7、_hi列為例):1. 獲得hi值:讀取并記錄數(shù)據(jù)庫(kù)的hibernate_unique_key表中next_hi字段的值,數(shù)據(jù)庫(kù)中此字段值加1保存。2. 獲得lo值:從0到max_lo循環(huán)取值,差值為1,當(dāng)值為max_lo值時(shí),重新獲取hi值,然后lo值繼續(xù)從0到max_lo循環(huán)。3. 根據(jù)公式 hi * (max_lo + 1) + lo計(jì)算生成主鍵值。注意:當(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配置大一
8、點(diǎn),這樣可以減少讀取數(shù)據(jù)表的次數(shù),提高效率;反之,如果服務(wù)器經(jīng)常重啟,可以吧max_lo配置小一點(diǎn),可以避免每次重啟主鍵之間的間隔太大,造成主鍵值主鍵不連貫。特點(diǎn):跨數(shù)據(jù)庫(kù),hilo算法生成的標(biāo)志只能在一個(gè)數(shù)據(jù)庫(kù)中保證唯一。4、seqhilo與hilo類(lèi)似,通過(guò)hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,只是將hilo中的數(shù)據(jù)表?yè)Q成了序列sequence,需要數(shù)據(jù)庫(kù)中先創(chuàng)建sequence,適用于支持sequence的數(shù)據(jù)庫(kù),如Oracle。<id name="id" column="id"><generator class="seqh
9、ilo"><param name="sequence">hibernate_seq</param><param name="max_lo">100</param></generator></id> 特點(diǎn):與hilo類(lèi)似,只能在支持序列的數(shù)據(jù)庫(kù)中使用。5、sequence采用數(shù)據(jù)庫(kù)提供的sequence機(jī)制生成主鍵,需要數(shù)據(jù)庫(kù)支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL這種不支持sequenc
10、e的數(shù)據(jù)庫(kù)則不行(可以使用identity)。<generator class="sequence"><param name="sequence">hibernate_id</param></generator><param name="sequence">hibernate_id</param> 指定sequence的名稱(chēng)Hibernate生成主鍵時(shí),查找sequence并賦給主鍵值,主鍵值由數(shù)據(jù)庫(kù)生成,Hibernate不負(fù)責(zé)維護(hù),使用時(shí)必須先創(chuàng)建一個(gè)sequ
11、ence,如果不指定sequence名稱(chēng),則使用Hibernate默認(rèn)的sequence,名稱(chēng)為hibernate_sequence,前提要在數(shù)據(jù)庫(kù)中創(chuàng)建該sequence。特點(diǎn):只能在支持序列的數(shù)據(jù)庫(kù)中使用,如Oracle。6、identityidentity由底層數(shù)據(jù)庫(kù)生成標(biāo)識(shí)符。identity是由數(shù)據(jù)庫(kù)自己生成的,但這個(gè)主鍵必須設(shè)置為自增長(zhǎng),使用identity的前提條件是底層數(shù)據(jù)庫(kù)支持自動(dòng)增長(zhǎng)字段類(lèi)型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle這類(lèi)沒(méi)有自增字段的則不支持。<id name="id" c
12、olumn="id"><generator class="identity" /></id>例:如果使用MySQL數(shù)據(jù)庫(kù),則主鍵字段必須設(shè)置成auto_increment。id int(11) primary key auto_increment特點(diǎn):只能用在支持自動(dòng)增長(zhǎng)的字段數(shù)據(jù)庫(kù)中使用,如MySQL。7、nativenative由hibernate根據(jù)使用的數(shù)據(jù)庫(kù)自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式,靈活性很強(qiáng)。如果能支持identity則使用identity,如果支持sequ
13、ence則使用sequence。<id name="id" column="id"><generator class="native" /></id>例如MySQL使用identity,Oracle使用sequence注意:如果Hibernate自動(dòng)選擇sequence或者h(yuǎn)ilo,則所有的表的主鍵都會(huì)從Hibernate默認(rèn)的sequence或hilo表中取。并且,有的數(shù)據(jù)庫(kù)對(duì)于默認(rèn)情況主鍵生成測(cè)試的支持,效率并不是很高。使用sequence或hilo時(shí),可以加入?yún)?shù),指定sequence名稱(chēng)或h
14、i值表名稱(chēng)等,如<param name="sequence">hibernate_id</param>特點(diǎn):根據(jù)數(shù)據(jù)庫(kù)自動(dòng)選擇,項(xiàng)目中如果用到多個(gè)數(shù)據(jù)庫(kù)時(shí),可以使用這種方式,使用時(shí)需要設(shè)置表的自增字段或建立序列,建立表等。8、uuidUUID: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-xx
15、xxxxxxxx (8-4-4-4-12)其中每個(gè) x 是 0-9 或 a-f 范圍內(nèi)的一個(gè)十六進(jìn)制的數(shù)字。<id name="id" column="id"><generator class="uuid" /></id>Hibernate在保存對(duì)象時(shí),生成一個(gè)UUID字符串作為主鍵,保證了唯一性,但其并無(wú)任何業(yè)務(wù)邏輯意義,只能作為主鍵,唯一缺點(diǎn)長(zhǎng)度較大,32位(Hibernate將UUID中間的“-”刪除了)的字符串,占用存儲(chǔ)空間大,但是有兩個(gè)很重要的優(yōu)點(diǎn),Hibernate在維護(hù)主鍵時(shí),不用去數(shù)
16、據(jù)庫(kù)查詢(xún),從而提高效率,而且它是跨數(shù)據(jù)庫(kù)的,以后切換數(shù)據(jù)庫(kù)極其方便。特點(diǎn):uuid長(zhǎng)度大,占用空間大,跨數(shù)據(jù)庫(kù),不用訪問(wèn)數(shù)據(jù)庫(kù)就生成主鍵值,所以效率高且能保證唯一性,移植非常方便,推薦使用。9、guidGUID: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ù)。<id name="id" column="id&quo
17、t;><generator class="guid" /></id>Hibernate在維護(hù)主鍵時(shí),先查詢(xún)數(shù)據(jù)庫(kù),獲得一個(gè)uuid字符串,該字符串就是主鍵值,該值唯一,缺點(diǎn)長(zhǎng)度較大,支持?jǐn)?shù)據(jù)庫(kù)有限,優(yōu)點(diǎn)同uuid,跨數(shù)據(jù)庫(kù),但是仍然需要訪問(wèn)數(shù)據(jù)庫(kù)。注意:長(zhǎng)度因數(shù)據(jù)庫(kù)不同而不同MySQL中使用select uuid()語(yǔ)句獲得的為36位(包含標(biāo)準(zhǔn)格式的“-”)Oracle中,使用select rawtohex(sys_guid() from dual語(yǔ)句獲得的為32位(不包含“-”) 特點(diǎn):需要數(shù)據(jù)庫(kù)支持查詢(xún)uuid,生成時(shí)需要查詢(xún)數(shù)據(jù)庫(kù),效率沒(méi)
18、有uuid高,推薦使用uuid。10、foreign使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的主鍵作為該對(duì)象主鍵。主要用于一對(duì)一關(guān)系中。<id name="id" column="id"><generator class="foreign"><param name="property">user</param></generator></id><one-to-one name="user" class="domain.Use
19、r" constrained="true" />該例使用domain.User的主鍵作為本類(lèi)映射的主鍵。特點(diǎn):很少使用,大多用在一對(duì)一關(guān)系中。11、select使用觸發(fā)器生成主鍵,主要用于早期的數(shù)據(jù)庫(kù)主鍵生成機(jī)制,能用到的地方非常少。12、其他注釋方式配置注釋方式與配置文件底層實(shí)現(xiàn)方式相同,只是配置的方式換成了注釋方式自動(dòng)增長(zhǎng),適用于支持自增字段的數(shù)據(jù)庫(kù)IdGeneratedValue(strategy = GenerationType.IDENTITY)根據(jù)底層數(shù)據(jù)庫(kù)自動(dòng)選擇方式,需要底層數(shù)據(jù)庫(kù)的設(shè)置如MySQL,會(huì)使用自增字段,需要將主鍵設(shè)置成auto_
20、increment。IdGeneratedValue(strategy = GenerationType.AUTO)使用表存儲(chǔ)生成的主鍵,可以跨數(shù)據(jù)庫(kù)。每次需要主鍵值時(shí),查詢(xún)名為"hibernate_table"的表,查找主鍵列"gen_pk"值為"2"記錄,得到這條記錄的"gen_val"值,根據(jù)這個(gè)值,和allocationSize的值生成主鍵值。IdGeneratedValue(strategy = GenerationType.TABLE, generator = "ud")TableG
21、enerator(name = "ud",table = "hibernate_table",pkColumnName = "gen_pk",pkColumnValue = "2",valueColumnName = "gen_val",initialValue = 2,allocationSize = 5)使用序列存儲(chǔ)主鍵值IdGeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ud")Sequen
22、ceGenerator(name = "ud",sequenceName = "hibernate_seq",allocationSize = 1,initialValue = 2)13、小結(jié)1、為了保證對(duì)象標(biāo)識(shí)符的唯一性與不可變性,應(yīng)該讓Hibernate來(lái)為主鍵賦值,而不是程序。2、正常使用Hibernate維護(hù)主鍵,最好將主鍵的setter方法設(shè)置成private,從而避免人為或程序修改主鍵,而使用assigned方式,就不能用private,否則無(wú)法給主鍵賦值。2、Hibernate中唯一一種最簡(jiǎn)單通用的主鍵生成器就是uuid。雖然是個(gè)32位難讀
23、的長(zhǎng)字符串,但是它沒(méi)有跨數(shù)據(jù)庫(kù)的問(wèn)題,將來(lái)切換數(shù)據(jù)庫(kù)極其簡(jiǎn)單方便,推薦使用!3、自動(dòng)增長(zhǎng)字段類(lèi)型與序列數(shù)據(jù)庫(kù)自動(dòng)增長(zhǎng)字段序列MySQL是 Oracle 是DB2是是MS SQL Server是 Sybase是 HypersonicSQL是 PostgreSQL 是SAP DB 是HSQLDB是 Infomix是 4、關(guān)于hilo機(jī)制注意:hilo算法生成的標(biāo)志只能在一個(gè)數(shù)據(jù)庫(kù)中保證唯一。當(dāng)用戶(hù)為Hibernate自行提供連接,或者Hibernate通過(guò)JTA,從應(yīng)用服務(wù)器的數(shù)據(jù)源獲取數(shù)據(jù)庫(kù)連接時(shí),無(wú)法使用hilo,因?yàn)檫@不能保證hilo單獨(dú)在新的數(shù)據(jù)庫(kù)連接的事務(wù)中訪問(wèn)hi值表,這種情況,如果數(shù)
24、據(jù)庫(kù)支持序列,可以使用seqhilo。5、使用identity、native、GenerationType.AUTO等方式生成主鍵時(shí),只要用到自增字段,數(shù)據(jù)庫(kù)表的字段必須設(shè)置成自動(dòng)增加的,否則出錯(cuò)。6、還有一些方法未列出來(lái),例如uuid.hex,sequence-identity等,這些方法不是很常用,且已被其他方法代替,如uuid.hex,官方文檔里建議不使用,而直接使用uuid方法。7、Hibernate的各版本主鍵生成策略配置有略微差別,但實(shí)現(xiàn)基本相同。如,有的版本默認(rèn)sequence不指定序列名,則使用名為hibernate_sequence的序列,有的版本則必須指定序列名。8、還可以
25、自定義主鍵生成策略,這里暫時(shí)不討論,只討論官方自帶生成策略。Hibernate各種主鍵生成策略與配置詳解1、assigned主鍵由外部程序負(fù)責(zé)生成,在 save() 之前必須指定一個(gè)。Hibernate不負(fù)責(zé)維護(hù)主鍵生成。與Hibernate和底層數(shù)據(jù)庫(kù)都無(wú)關(guān),可以跨數(shù)據(jù)庫(kù)。在存儲(chǔ)對(duì)象前,必須要使用主鍵的setter方法給主鍵賦值,至于這個(gè)值怎么生成,完全由自己決定,這種方法應(yīng)該盡量避免。<id name="id" column="id"><generator class="assigned&qu
26、ot; /></id>“ud”是自定義的策略名,人為起的名字,后面均用“ud”表示。特點(diǎn):可以跨數(shù)據(jù)庫(kù),人為控制主鍵生成,應(yīng)盡量避免。2、increment由Hibernate從數(shù)據(jù)庫(kù)中取出主鍵的最大值(每個(gè)session只取1次),以該值為基礎(chǔ),每次增量為1,在內(nèi)存中生成主鍵,不依賴(lài)于底層的數(shù)據(jù)庫(kù),因此可以跨數(shù)據(jù)庫(kù)。<id name="id" column="id"><generator class="increment" /></id>Hibernate調(diào)用org.hibern
27、ate.id.IncrementGenerator類(lèi)里面的generate()方法,使用select max(idColumnName) from tableName語(yǔ)句獲取主鍵最大值。該方法被聲明成了synchronized,所以在一個(gè)獨(dú)立的Java虛擬機(jī)內(nèi)部是沒(méi)有問(wèn)題的,然而,在多個(gè)JVM同時(shí)并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)select max時(shí)就可能取出相同的值,再insert就會(huì)發(fā)生Dumplicate entry的錯(cuò)誤。所以只能有一個(gè)Hibernate應(yīng)用進(jìn)程訪問(wèn)數(shù)據(jù)庫(kù),否則就可能產(chǎn)生主鍵沖突,所以不適合多進(jìn)程并發(fā)更新數(shù)據(jù)庫(kù),適合單一進(jìn)程訪問(wèn)數(shù)據(jù)庫(kù),不能用于群集環(huán)境。官方文檔:只有在沒(méi)有其他進(jìn)程往同一
28、張表中插入數(shù)據(jù)時(shí)才能使用,在集群下不要使用。特點(diǎn):跨數(shù)據(jù)庫(kù),不適合多進(jìn)程并發(fā)更新數(shù)據(jù)庫(kù),適合單一進(jìn)程訪問(wèn)數(shù)據(jù)庫(kù),不能用于群集環(huán)境。3、hilohilo(高低位方式high low)是hibernate中最常用的一種生成方式,需要一張額外的表保存hi的值。保存hi值的表至少有一條記錄(只與第一條記錄有關(guān)),否則會(huì)出現(xiàn)錯(cuò)誤??梢钥鐢?shù)據(jù)庫(kù)。<id name="id" column="id"><generator class="hilo"><param name="table">hibe
29、rnate_hilo</param><param name="column">next_hi</param><param name="max_lo">100</param></generator></id><param name="table">hibernate_hilo</param> 指定保存hi值的表名<param name="column">next_hi</param&
30、gt; 指定保存hi值的列名<param name="max_lo">100</param> 指定低位的最大值也可以省略table和column配置,其默認(rèn)的表為hibernate_unique_key,列為next_hi<id name="id" column="id"><generator class="hilo"><param name="max_lo">100</param></genera
31、tor></id>hilo生成器生成主鍵的過(guò)程(以hibernate_unique_key表,next_hi列為例):1. 獲得hi值:讀取并記錄數(shù)據(jù)庫(kù)的hibernate_unique_key表中next_hi字段的值,數(shù)據(jù)庫(kù)中此字段值加1保存。2. 獲得lo值:從0到max_lo循環(huán)取值,差值為1,當(dāng)值為max_lo值時(shí),重新獲取hi值,然后lo值繼續(xù)從0到max_lo循環(huán)。3. 根據(jù)公式 hi * (max_lo + 1) + lo計(jì)算生成主鍵值。注意:當(dāng)hi值是0的時(shí)候,那么第一個(gè)值不是0*(max_lo+1)+0=0,而是lo
32、跳過(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ù)中保證唯一。4、seqhilo與hilo類(lèi)似,通過(guò)hi/lo算法實(shí)現(xiàn)的主鍵生成機(jī)制,只是將hilo中的數(shù)據(jù)表?yè)Q成了序列sequence,需要數(shù)據(jù)庫(kù)中先創(chuàng)建sequence,適用于支持sequence的數(shù)據(jù)庫(kù),如Oracle。&l
33、t;id name="id" column="id"><generator class="seqhilo"><param name="sequence">hibernate_seq</param><param name="max_lo">100</param></generator></id> 特點(diǎn):與hilo類(lèi)似,只能在支持序列的數(shù)據(jù)庫(kù)中使用。5、sequence采用數(shù)據(jù)庫(kù)提供的sequence
34、機(jī)制生成主鍵,需要數(shù)據(jù)庫(kù)支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL這種不支持sequence的數(shù)據(jù)庫(kù)則不行(可以使用identity)。<generator class="sequence"><param name="sequence">hibernate_id</param></generator><param name="sequence">hibernate_id</param>
35、 指定sequence的名稱(chēng)Hibernate生成主鍵時(shí),查找sequence并賦給主鍵值,主鍵值由數(shù)據(jù)庫(kù)生成,Hibernate不負(fù)責(zé)維護(hù),使用時(shí)必須先創(chuàng)建一個(gè)sequence,如果不指定sequence名稱(chēng),則使用Hibernate默認(rèn)的sequence,名稱(chēng)為hibernate_sequence,前提要在數(shù)據(jù)庫(kù)中創(chuàng)建該sequence。特點(diǎn):只能在支持序列的數(shù)據(jù)庫(kù)中使用,如Oracle。6、identityidentity由底層數(shù)據(jù)庫(kù)生成標(biāo)識(shí)符。identity是由數(shù)據(jù)庫(kù)自己生成的,但這個(gè)主鍵必須設(shè)置為自增長(zhǎng),使用identity的前提條件是底層數(shù)據(jù)庫(kù)支持自動(dòng)增長(zhǎng)字段類(lèi)型,如D
36、B2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle這類(lèi)沒(méi)有自增字段的則不支持。<id name="id" column="id"><generator class="identity" /></id>例:如果使用MySQL數(shù)據(jù)庫(kù),則主鍵字段必須設(shè)置成auto_increment。id int(11) primary key auto_increment特點(diǎn):只能用在支持自動(dòng)增長(zhǎng)的字段數(shù)據(jù)庫(kù)中使用,如MySQL。7、nativenative由hiberna
37、te根據(jù)使用的數(shù)據(jù)庫(kù)自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式,靈活性很強(qiáng)。如果能支持identity則使用identity,如果支持sequence則使用sequence。<id name="id" column="id"><generator class="native" /></id>例如MySQL使用identity,Oracle使用sequence注意:如果Hibernate自動(dòng)選擇sequence或者h(yuǎn)ilo,則所有的表的主鍵都會(huì)從Hibernate
38、默認(rèn)的sequence或hilo表中取。并且,有的數(shù)據(jù)庫(kù)對(duì)于默認(rèn)情況主鍵生成測(cè)試的支持,效率并不是很高。使用sequence或hilo時(shí),可以加入?yún)?shù),指定sequence名稱(chēng)或hi值表名稱(chēng)等,如<param name="sequence">hibernate_id</param>特點(diǎn):根據(jù)數(shù)據(jù)庫(kù)自動(dòng)選擇,項(xiàng)目中如果用到多個(gè)數(shù)據(jù)庫(kù)時(shí),可以使用這種方式,使用時(shí)需要設(shè)置表的自增字段或建立序列,建立表等。8、uuidUUID:Universally Unique Identifier,是指在一臺(tái)機(jī)器上生成的數(shù)字,它保證對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的。按
39、照開(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-f 范圍內(nèi)的一個(gè)十六進(jìn)制的數(shù)字。<id name="id" column="id"><generator class="uuid" /></id>Hibernate在保存對(duì)象時(shí),生成一個(gè)U
40、UID字符串作為主鍵,保證了唯一性,但其并無(wú)任何業(yè)務(wù)邏輯意義,只能作為主鍵,唯一缺點(diǎn)長(zhǎng)度較大,32位(Hibernate將UUID中間的“-”刪除了)的字符串,占用存儲(chǔ)空間大,但是有兩個(gè)很重要的優(yōu)點(diǎn),Hibernate在維護(hù)主鍵時(shí),不用去數(shù)據(jù)庫(kù)查詢(xún),從而提高效率,而且它是跨數(shù)據(jù)庫(kù)的,以后切換數(shù)據(jù)庫(kù)極其方便。特點(diǎn):uuid長(zhǎng)度大,占用空間大,跨數(shù)據(jù)庫(kù),不用訪問(wèn)數(shù)據(jù)庫(kù)就生成主鍵值,所以效率高且能保證唯一性,移植非常方便,推薦使用。9、guidGUID:Globally Unique Identifier全球唯一標(biāo)識(shí)符,也稱(chēng)作 UUID,是一個(gè)128位長(zhǎng)的數(shù)字,用16進(jìn)制表示。算法的核心思
41、想是結(jié)合機(jī)器的網(wǎng)卡、當(dāng)?shù)貢r(shí)間、一個(gè)隨即數(shù)來(lái)生成GUID。從理論上講,如果一臺(tái)機(jī)器每秒產(chǎn)生10000000個(gè)GUID,則可以保證(概率意義上)3240年不重復(fù)。<id name="id" column="id"><generator class="guid" /></id>Hibernate在維護(hù)主鍵時(shí),先查詢(xún)數(shù)據(jù)庫(kù),獲得一個(gè)uuid字符串,該字符串就是主鍵值,該值唯一,缺點(diǎn)長(zhǎng)度較大,支持?jǐn)?shù)據(jù)庫(kù)有限,優(yōu)點(diǎn)同uuid,跨數(shù)據(jù)庫(kù),但是仍然需要訪問(wèn)數(shù)據(jù)庫(kù)。注意:長(zhǎng)度因數(shù)據(jù)庫(kù)不同而不同MySQL中使用sele
42、ct uuid()語(yǔ)句獲得的為36位(包含標(biāo)準(zhǔn)格式的“-”)Oracle中,使用select rawtohex(sys_guid() from dual語(yǔ)句獲得的為32位(不包含“-”) 特點(diǎn):需要數(shù)據(jù)庫(kù)支持查詢(xún)uuid,生成時(shí)需要查詢(xún)數(shù)據(jù)庫(kù),效率沒(méi)有uuid高,推薦使用uuid。10、foreign使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的主鍵作為該對(duì)象主鍵。主要用于一對(duì)一關(guān)系中。<id name="id" column="id"><generator class="foreign"><param name=
43、"property">user</param></generator></id><one-to-one name="user" class="domain.User" constrained="true" />該例使用domain.User的主鍵作為本類(lèi)映射的主鍵。特點(diǎn):很少使用,大多用在一對(duì)一關(guān)系中。11、select使用觸發(fā)器生成主鍵,主要用于早期的數(shù)據(jù)庫(kù)主鍵生成機(jī)制,能用到的地方非常少。12、其他注釋方式配置注釋方式與配置文件底層實(shí)現(xiàn)方式相同,只是配置的方式換成了注釋方式自動(dòng)增長(zhǎng),適用于支持自增字段的數(shù)據(jù)庫(kù)IdGeneratedValue(strategy = GenerationType.IDENTITY)根據(jù)底層數(shù)據(jù)庫(kù)自動(dòng)選擇方式,需要底層數(shù)據(jù)庫(kù)的設(shè)置如MySQL,會(huì)使用自增字段,需要將主鍵設(shè)置成auto_increment。IdGeneratedValue(strategy = GenerationType.AUTO)使用表存儲(chǔ)生成的主鍵,可以跨數(shù)據(jù)庫(kù)。每次需要主鍵值時(shí),查詢(xún)名為"hibernate_table"的表,查
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 發(fā)廊招收學(xué)徒合同范本
- 代加工合作合同范本
- 印刷制作度合同范本
- 合伙合同范本盈利分配
- 上海市戶(hù)外廣告合同范本
- 攝影作品使用授權(quán)合同范本
- epc o模式合同范本
- 口罩采購(gòu)居間合同范本
- 刷單合同范本
- 店鋪的轉(zhuǎn)讓合同范本
- 2024年環(huán)北部灣廣西水資源配置有限公司招聘考試真題
- 2025年黑龍江建筑職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)完美版
- 第16課《有為有不為 》課件-2024-2025學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)下冊(cè)
- 上海市建設(shè)工程施工圖設(shè)計(jì)文件勘察設(shè)計(jì)質(zhì)量疑難問(wèn)題匯編(2024 版)
- 第一單元時(shí)、分、秒(說(shuō)課稿)-2024-2025學(xué)年三年級(jí)上冊(cè)數(shù)學(xué)人教版
- 地理-浙江省杭州八縣市2024學(xué)年高二第一學(xué)期期末學(xué)業(yè)水平測(cè)試試題和答案
- 《康復(fù)工程學(xué)》課件-第一講 康復(fù)工程概論
- DeepSeek:從入門(mén)到精通
- 天津2025年天津中德應(yīng)用技術(shù)大學(xué)輔導(dǎo)員崗位招聘7人筆試歷年參考題庫(kù)附帶答案詳解
- 2025年無(wú)錫職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 2025年銅材拉絲項(xiàng)目可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論