小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Hibernate主鍵生成 Key Generator - cool_rain_man的專...

 日全食 2009-07-22
Hibernate主鍵生成 Key Generator 收藏
     Hibernate 主鍵生成器是負責生成數(shù)據(jù)表記錄的主鍵,通常有如下幾種常見的主鍵生成方式。
Hibernate主鍵生成方式 Key Generator
主鍵產(chǎn)生器:
首先介紹幾種常見的主鍵生生器:
1) increment
increment: 對 long , short 或 int 的數(shù)據(jù)列生成自動增長主鍵。
主鍵按數(shù)值順序遞增。此方式的實現(xiàn)機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候?qū)⒋酥导?作為主鍵。這種方式可能產(chǎn)生的問題是:如果當前有多個實例訪問同一個數(shù)據(jù)庫,那么由于各個實例各自維護主鍵狀態(tài),不同實例可能生成同樣的主鍵,從而造成主鍵重復異常。因此,如果同一數(shù)據(jù)庫有多個實
例訪問,此方式必須避免使用。
2) identity
對如 SQL server , MySQL 等支持自動增長列的數(shù)據(jù)庫,如果數(shù)據(jù)列的類型是 long, short 或 int ,可使用主鍵生成器生成自動增長主鍵。
3) seqhilo
對如 Oracle , DB2 等支持 Sequence 的數(shù)據(jù)庫,如果數(shù)據(jù)列的類型是 long,short 或 int ,可使用該主鍵生成器生成自動增長主鍵。 對 Sequence 解釋可以參見 http://easyworld./blog/214098
4)uuid:
對字符串列的數(shù)據(jù)采用 128-位 uuid 算法生成唯一的字符串主鍵。
5) hilo
通過hi/lo 算法實現(xiàn)的主鍵生成機制,需要額外的數(shù)據(jù)庫表保存主鍵生成歷史狀態(tài)。
6) foreign
使用外部表的字段作為主鍵。
7) native
由Hibernate根據(jù)底層數(shù)據(jù)庫自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式,這種方式我在開法過程中經(jīng)常用到,意思是把主鍵的生成方式交給底層數(shù)據(jù)庫來決定。
8) assigned
主鍵由外部程序負責生成,無需Hibernate參與。
9) uuid.hex
由Hibernate基于128 位唯一值產(chǎn)生算法生成16 進制數(shù)值(編碼后以長度32 的字符串表示)作為主鍵。
10) uuid.string
與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16)。在某些數(shù)據(jù)庫中可能出現(xiàn)問題(如PostgreSQL)。
一般而言,利用uuid.hex方式生成主鍵將提供最好的性能和數(shù)據(jù)庫平臺適應性。
另外由于常用的數(shù)據(jù)庫,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主鍵生成機制(Auto-Increase 字段或者Sequence)。我們可以在數(shù)據(jù)庫提供的主鍵生成機制上,采用generator-class=native的主鍵生成方式。不過值得注意的是,一些數(shù)據(jù)庫提供的主鍵生成機制在效率上未必最佳,大量并發(fā)insert數(shù)據(jù)時可能會引起表之間的互鎖。數(shù)據(jù)庫提供的主鍵生成機制,往往是通過在一個內(nèi)部表中保存當前主鍵狀態(tài)(如對于自增型主鍵而言,此內(nèi)部表中就維護著當前的最大值和遞增量),之后每次插入數(shù)據(jù)會讀取這個最大值,然后加上遞增量作為新記錄的主鍵,之后再把這個新的最大值更新回內(nèi)部表中,這樣,一次Insert操作可能導致數(shù)據(jù)庫內(nèi)部多次表讀寫操作,同時伴隨的還有數(shù)據(jù)的加鎖解鎖操作,這對性能產(chǎn)生了較大影響。因此,對于并發(fā)Insert要求較高的系統(tǒng),推薦采用uuid.hex 作為主鍵生成機制。
 
 
 
 
1、increment 標識符生成器
 該生成器由Hibernate以遞增的方式為代理主鍵賦值。在初始化階段,Hibernate讀取表中的最大主鍵值,當插入記錄時,在最大值基礎上遞增,增量為1。如果有兩個Hibernate應用進程訪問同一個數(shù)據(jù)庫表,可能出現(xiàn)同時獲取相同的最大值,導致出現(xiàn)相同的主鍵值,從而有一個進程插入失??!
使用范圍:
-生成標識符機制不依賴于底層數(shù)據(jù)庫系統(tǒng),所以他適合于所有的數(shù)據(jù)庫系統(tǒng)。
-適用于只有單個Hibernate應用進程訪問同一個數(shù)據(jù)庫的場合,在集群環(huán)境下不推薦使用
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。
2、identity標識符生成器
該生成器由底層數(shù)據(jù)庫來負責生成標識符,他要求底層數(shù)據(jù)庫把主鍵定義為自動增長字段類型。
適用范圍:
-由于依賴于底層數(shù)據(jù)庫,所以要求底層數(shù)據(jù)系統(tǒng)必須支持自動增長字段類型。包括:DB2、MySQL、MsSQL、Sybase、HSQLDB、Informix等
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。
3、sequence標識符生成器
該標識符生成器利用底層數(shù)據(jù)庫提供的序列來生成標識符。
<generator class="sequence">
       <param name="sequence">tester_id_seq</param>
</generator>
在生成的DDL代碼中會生成:
create sequence tester_id_seq;
注:MySQL不支持sequence。
當Hibernate在持久化一個SequenceTester對象時,先從底層數(shù)據(jù)庫的tester_id_seq序列中獲得一個唯一的序列號,再把它作為主鍵值。
適用范圍:
-要求底層數(shù)據(jù)庫必須支持序列,包括:Oracle、DB2、SAP DB、PostgreSQL等。
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。
4、hilo標識符生成器
hilo標識符生成器由HIbernate按照一種high/low算法來生成標識符,他從數(shù)據(jù)庫的特定表字段中獲取high值
    <id name="id" type="long" column="ID">
    <generator class="hilo">
                <param name="table">hi_value</param>
                <param name="column">next_value</param>
                <param name="max_lo">100</param>
        </generator>
    </id>
上例:high值放在hi_value表的next_value字段中
Hibernate在持久化一個對象時,需要讀取并修改hi_value表中的next_value值。這段操作在單獨的事務中處理。當save時,不使用當前session對象的當前數(shù)據(jù)庫聯(lián)接和事務,而是在一個新的數(shù)據(jù)庫連接中創(chuàng)建新事務,然后訪問hi_value表。
適用范圍:
-適用于所有的數(shù)據(jù)庫系統(tǒng)。
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。
-只能在一個數(shù)據(jù)庫中保證標識符唯一
-當用戶為Hibernate自行提供數(shù)據(jù)庫聯(lián)接,或者Hibernate通過JTA,從應用服務器的數(shù)據(jù)源獲得數(shù)據(jù)庫聯(lián)接時無法適用hilo,因為這樣不能保證hilo在新的數(shù)據(jù)庫連接的事務中訪問hi_value表。在這種情況下,如果數(shù)據(jù)庫系統(tǒng)支持序列,可以適用seqhilo生成器。對于支持序列的數(shù)據(jù)庫系統(tǒng),可以適用seqhilo,它從序列中獲取high值。
5、native標識符生成器
該生成器依據(jù)底層數(shù)據(jù)庫對自動生成標識符的支持能力,來選擇適用identity、sequence或hilo標識符生成器。能自動判斷底層數(shù)據(jù)庫提供的生成標識符的機制。
適用范圍:
-適合于跨數(shù)據(jù)庫平臺開發(fā),即同一個Hibernate應用需要連接多種數(shù)據(jù)庫系統(tǒng)的場合
-OID必須為long、int或short型,如果定義為byte類型,會拋出異常。

 
發(fā)表于 @ 2008年08月19日 11:22:00 | 評論( 0 ) | 編輯| 舉報| 收藏
舊一篇:Spring MVC快速上手教程 | 新一篇:在struts2中使用攔截器(Interceptor)控制登錄和權(quán)限給cool_rain_man的留言只有注冊用戶才能發(fā)表評論!登錄注冊姓   名:
校驗碼:
 Csdn Blog version 3.1a
Copyright © cool_rain_man  
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/cool_rain_man/archive/2008/08/19/2794407.aspx

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多