隨筆-9  評論-168  文章-266  trackbacks-0
                1)increment 代理主鍵,hibernate自動以遞增的方式來生成標(biāo)識符,每次增加1.
                2)identity 代理主鍵,由底層數(shù)據(jù)庫生成標(biāo)識符,前提就是底層的數(shù)據(jù)庫支持自動增長的類型.
                3)sequence 代理主鍵,hibernate根據(jù)底層數(shù)據(jù)庫生成的標(biāo)識符,前提是底層數(shù)據(jù)庫支持序列
                4)hilo 代理主鍵,hibernate根據(jù)higg/low算法來生成的標(biāo)識符,把特定表的字段作為high的值,默認(rèn)選用hibernate_unique_key表的next_hi字段
                5)native 代理主鍵,根據(jù)底層數(shù)據(jù)庫對自動生成標(biāo)識符的支持能力,還選擇identity,sequence,或hilo.
                6)uuid.hex 代理主鍵,hibernate采用128位的UUID算法生成標(biāo)識符,UUID算法能夠在網(wǎng)絡(luò)環(huán)境下生成唯一字符串標(biāo)識符.不過字符串要比數(shù)據(jù)占用的空間多的多.所以不流行使用.
                7)assigned 適用于自然主鍵,由JAVA應(yīng)用程序負(fù)責(zé)生成標(biāo)識符,為了能讓JAVA設(shè)置OID.不能吧setId方法設(shè)置為非公共類型了,這種方式也盡量避免使用.
                這里個(gè)人覺得第一種方式,也就是說由Hibernate來生成對象標(biāo)識符的方式比較好.但是這種方式的缺點(diǎn)是只能一個(gè)Hibernate對應(yīng)一個(gè)數(shù)據(jù)庫的表.當(dāng)同時(shí)創(chuàng)建了SeesionFactory實(shí)例的時(shí)候.兩個(gè)或者更多的Hibernate對應(yīng)同一個(gè)數(shù)據(jù)庫的時(shí)候就會插入出錯(cuò).這個(gè)時(shí)候我們可以選擇第二種方式把標(biāo)識符的生成工作交給底層數(shù)據(jù)庫.還有一個(gè)小知識點(diǎn)要注意就是OID必須定義為long,int,short類型,如果定義為byte會報(bào)異常,這里推薦用long.
                總結(jié)一下,這7中生成OID標(biāo)識符的方法,increment 比較常用,把標(biāo)識符生成的權(quán)力交給Hibernate處理.但是當(dāng)同時(shí)多個(gè)Hibernate應(yīng)用操作同一個(gè)數(shù)據(jù)庫,甚至同一張表的時(shí)候.就推薦使用identity 依賴底層數(shù)據(jù)庫實(shí)現(xiàn),但是數(shù)據(jù)庫必須支持自動增長,sequence 以來底層數(shù)據(jù)庫實(shí)現(xiàn),但是數(shù)據(jù)庫必須支持系列.hilo 根據(jù)特定的表實(shí)現(xiàn).這三種方式了.當(dāng)然針對不同的數(shù)據(jù)庫選擇不同的方法.如果你不能確定你使用的數(shù)據(jù)庫具體支持什么的情況下.可以選擇第三種.或者用native 讓Hibernate來幫選擇identity,sequence,或hilo.后邊的自然主鍵不推薦使用,因?yàn)樽匀恢麈I就是具有業(yè)務(wù)含義的主鍵,在現(xiàn)在的軟件開發(fā)結(jié)構(gòu)中,已經(jīng)很少有人用了.下面總結(jié)一下幾種常用數(shù)據(jù)庫,可以使用的標(biāo)識符類型.
                MySQL:identity數(shù)據(jù)庫底層實(shí)現(xiàn),需要支持自動增長,increment由Hibernate實(shí)現(xiàn),hilo用特定的表實(shí)現(xiàn),
                MSSQL:identity數(shù)據(jù)庫底層實(shí)現(xiàn),需要支持自動增長,increment由Hibernate實(shí)現(xiàn),hilo用特定的表實(shí)現(xiàn),
                Oracle:sequence數(shù)據(jù)庫底層實(shí)現(xiàn),需要支持序列,increment由Hibernate實(shí)現(xiàn),hilo用特定的表實(shí)現(xiàn),
                以上不難發(fā)現(xiàn),所有的數(shù)據(jù)庫都支持Hibernate用increment實(shí)現(xiàn)OID的生成,MYSQL和MSSQL數(shù)據(jù)庫底層實(shí)現(xiàn)支持自動增長,而Oracle支持序列,還有用特殊表的實(shí)現(xiàn)方式這三個(gè)數(shù)據(jù)庫都支持.還有一種實(shí)現(xiàn)方式適用于所有的數(shù)據(jù)庫,就是native,由Hibernate去選擇使用什么樣的方式來生成IOD對象標(biāo)識符,這種方式也是跨平臺的.

                                                                                               --------------摘自:http://www.aygfsteel.com/action/archive/2007/05/22/119134.html
          posted on 2008-03-19 12:11 紫蝶∏飛揚(yáng)↗ 閱讀(344) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 寿光市| 商丘市| 广南县| 长阳| 兰州市| 襄城县| 景洪市| 宜阳县| 连平县| 阿拉善左旗| 军事| 肃宁县| 茂名市| 新源县| 武威市| 托里县| 华阴市| 遵义县| 陆川县| 叶城县| 永平县| 周至县| 重庆市| 西平县| 鄢陵县| 调兵山市| 正蓝旗| 瓮安县| 西乌珠穆沁旗| 宝丰县| 长子县| 孟州市| 东丽区| 十堰市| 庆阳市| 大兴区| 青州市| 荆州市| 洪江市| 邵阳市| 平果县|