日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate标识符属性(主键)生成策略全析

發布時間:2025/6/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate标识符属性(主键)生成策略全析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??? 數據庫中的主鍵能夠唯一識別一條記錄,它可以是一個字段也可以是多個字段的組合。主鍵的主要作用是標識表中的一條記錄,還有和其他表中的數據進行關聯。數據庫中的主鍵類型必須符合唯一性約束和非空約束。作為附加屬性,主鍵應該盡可能簡潔,不要包含過多屬性。根據這個原則,主鍵可以分為自然主鍵和代理主鍵。
??? 自然主鍵是數據表中有邏輯含義的字段,比如身份證號來唯一確定一條個人記錄。也可以通過學號和課程號來唯一確定成績。使用自然主鍵時如果業務發生變化則對數據庫調整是極其麻煩的,所以數據庫設計使用代理主鍵是非常好的選擇。代理主鍵是一個和業務無關的流水號,一般采用數據庫中自動增長的機制自動生成。例如Oracle數據庫使用序列,MySQL和SQL Server有自動增長(auto increment)類型,該字段類型一般為Integer,名稱設置為ID或XXID。下面來看看Hibernate中的主鍵生成策略,實驗都以Oracle為主,MySQL為輔來說明。
??? 第一種是increment策略,Hibernate配置如下:

Xml代碼 Xml代碼 ?
  • <id?name="id"?column="ID"?type="java.lang.Integer"?length="10">??
  • ????<generator?class="increment"></generator>??
  • </id>??

  • ??? 運行結果如下:

    Sql代碼 Sql代碼 ?
  • Hibernate:?select?max(ID)?from?USERS??
  • Hibernate:?insert?into?USERS?(NAME,?PHONE,?DEPARTMENT,?CITY,?HIRE_TIME,?ID)?values(?,??,??,??,??,??)??

  • ??? 可以看出,Hibernate是從數據庫中先找出已經存在的最大主鍵數值,然后加1后作為新紀錄的主鍵再執行插入語句。這種策略不適合非獨享數據庫或者分布式的Hibernate應用,否則就很難保證主鍵值的唯一了。
    ??? 第二種是identity策略,Hibernate中配置如下:

    Xml代碼 Xml代碼 ?
  • <id?name="id"?column="ID"?type="java.lang.Integer"?length="10">??
  • ????<generator?class="identity"></generator>??
  • </id>??

  • ??? 這種策略在Oracle中無法使用,因為這種策略是針對數據庫中字段自動增長類型。改在MySQL中測試,得到如下結果:

    Sql代碼 Sql代碼 ?
  • Hibernate:?insert?into?USERS?(NAME,?PHONE,?DEPARTMENT,?CITY,?HIRE_TIME)?values(?,??,??,??,??)??

  • ??? 多次運行程序,在數據庫中查看,可以看到主鍵是自動進行遞增的。
    ??? 第三種是sequence策略,Hibernate中配置如下:

    Xml代碼 Xml代碼 ?
  • <generator?class="sequence">??
  • ????????<param?name="sequence">SEQ_HIBERNATE_USERS</param>??
  • ????</generator>??

  • ??? 使用序列策略是,需要現在數據庫中創建一條序列,運行程序,得到如下結果:

    Sql代碼 Sql代碼 ?
  • Hibernate:?select?SEQ_HIBERNATE_USERS.nextval?from?dual??
  • Hibernate:?insert?into?USERS?(NAME,?PHONE,?DEPARTMENT,?CITY,?HIRE_TIME,?ID)?values?(?,??,??,??,??,??)??

  • ??? 可以看出Hibernate先從序列中得到下一個數值,然后執行插入操作。
    ??? 第四種是hilo策略,這是Hibernate采用一種稱為“高/低位”(hi/lo)的算法產生標識符屬性值,該算法采用一個高位值和一個低位值進行運算,結果作為標識符屬性的值。使用該策略時,需要在數據庫中建立一個表和其中一個字段,名稱可以自定。其中的字段值作為高位值的來源。在Hibernate中配置如下:

    Xml代碼 Xml代碼 ?
  • <generator?class="hilo">??
  • ????<param?name="table">HIBERNATE_KEY</param>??
  • ????<param?name="column">NEXT_HIVALUE</param>??
  • </generator>??

  • ??? 可以見名知意,我使用的表名是HIBERNATE_KEY,字段名是NEXT_HIVALUE,然后給該字段設置一個值,作為高位。低位Hibernate有自己的管理機制可不用創建,也可以給出在配置文件中用<param name="max_lo">1</param>的形式給出即可,一般使用情況下使用1更好。該算法是每次按max_lo數值遞增。Hibernate的執行結果還是一條語句,如下:

    Sql代碼 Sql代碼 ?
  • Hibernate:?insert?into?USERS?(NAME,?PHONE,?DEPARTMENT,?CITY,?HIRE_TIME,?ID)?values?(?,??,??,??,??,??)??

  • ??? 執行后高位自動加1,然后到數據庫中就可以查看生成的主鍵數值。該策略與底層的數據庫無關,只要保證高位降低,那么生成的主鍵值是唯一的,并且可跨數據庫使用。
    ??? 第五種是seqhilo策略,基于hilo策略,這種方式的標識符屬性生成時指定一個序列作為高位值,那么在Hibernate中的配置如下:

    Xml代碼 Xml代碼 ?
  • ????<generator?class="seqhilo">??
  • ????????<param?name="sequence">SEQ_HIBERNATE_USERS</param>??
  • </generator>??

  • ??? 執行插入后,Hibernate首先取出序列的下一個值作為高位值,然后計算一個ID出來進行操作,得到如下結果:

    Sql代碼 Sql代碼 ?
  • Hibernate:?select?SEQ_HIBERNATE_USERS.nextval?from?dual??
  • Hibernate:?insert?into?USERS?(NAME,?PHONE,?DEPARTMENT,?CITY,?HIRE_TIME,?ID)?values?(?,??,??,??,??,??)??

  • ??? 第六種是uuid策略,這種策略是使用128位的UUID算法來生成字符串類型標識符屬性,這種算法使用IP地址,JVM的啟動時間(精確到1/4秒),系統時間和一個計數器(在當前JVM中唯一)這些數值經過計算得到一個標識符屬性的值,產生的值是32位長度的字符串,則使用前需要將數據庫字段調整到varchar2(32),持久化類的ID屬性改為String進行測試。Hibernate中配置如下,注意字段信息的修改:

    Xml代碼 Xml代碼 ?
  • <id?name="id"?column="ID"?type="java.lang.String"?length="32">??
  • ????<generator?class="uuid">??
  • ????</generator>??
  • lt;/id>??

  • ??? 執行后Hibernate的結果還是一條插入語句,這里不再復制了,我們看看數據庫中的結果吧,如下圖,就得到了32位的主鍵值了。

    ??? 在做文件下載時,用這種策略生成的主鍵就可以作為下載鏈接,而不用在人為去制作鏈接,是一個不錯的選擇。
    ??? 第七種是guid策略,Hibernate中配置如下:

    Xml代碼 Xml代碼 ?
  • <generator?class="guid"></generator>??

  • ??? 這個在Oracle中是用了sys_guid()函數生成的值,而在MySQL中使用uuid()函數生成值,這個值要設置成varchar2/varchar類型,區別在于Oracle中是32位長度,而MySQL原生是36位(有4個-隔開)。運行程序得到如下結果:(Oracle環境下)

    Sql代碼 Sql代碼 ?
  • Hibernate:?select?rawtohex(sys_guid())?from?dual??
  • Hibernate:?insert?into?USERS?(NAME,?PHONE,?DEPARTMENT,?CITY,?HIRE_TIME,?ID)?values?(?,??,??,??,??,??)??

  • (MySQL環境下)

    Sql代碼 Sql代碼 ?
  • Hibernate:?select?uuid()??
  • Hibernate:?insert?into?USERS?(NAME,?PHONE,?DEPARTMENT,?CITY,?HIRE_TIME,?ID)?values?(?,??,??,??,??,??)??

  • ??? 第八種是native策略,native字面意思是“本地的”,那么對于數據庫,Hibernate該如何選擇呢?Hibernate根據所使用的數據庫支持能力從identity,sequence或者hilo策略中選擇一種,Hibernate中配置很簡單:

    Xml代碼 Xml代碼 ?
  • <generator?class="native"></generator>??

  • ??? 在Oracle下,Oracle先創建一個序列,使用默認名(數據庫名_SEQUENCE),然后執行插入操作,而在MySQL下則使用identity策略,使用了自動增長的字段。Oracle中測試結果如下:

    Sql代碼 Sql代碼 ?
  • Hibernate:?select?hibernate_sequence.nextval?from?dual??
  • Hibernate:?insert?into?USERS?(NAME,?PHONE,?DEPARTMENT,?CITY,?HIRE_TIME,?ID)?values?(?,??,??,??,??,??)??

  • ??? 第九種是assigned策略,這種方式也是Hibernate中<generator>沒有配置標識符屬性生成策略時默認使用的方式。但使用這種策略時需要我們自定義標識符屬性的值,也就是我們人為設置標識符屬性的值,這就需要在程序中顯式為標識符屬性(ID)賦值。配置方式如下:

    Xml代碼 Xml代碼 ?
  • <generator?class="assigned"></generator>??

  • ??? 第十種是foreign策略,這種方式是通過關聯的持久化對象為當前的持久化對象設置標識符屬性,當他們是一對一關聯時,一個持久化類的主鍵值可以參考關聯持久化類的標識符屬性值。我們做一個完整的實例來看。(使用Hibernate為我們自動創建表)?
    ?
    ??? 最后來說一下標識符屬性生成策略的選擇方式。應用不需要分布式時,在數據庫支持的sequence,identity,hilo,seqhilo和uuid中選擇比較好。而分布式數據庫應用中uuid是最佳選擇。若是改造遺留系統,那么使用assigned是最合適的了

    總結

    以上是生活随笔為你收集整理的Hibernate标识符属性(主键)生成策略全析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 中文字幕av久久爽一区 | 黄色链接视频 | 亚洲一区二区自偷自拍 | 都市豪门艳霸淫美妇 | 中文天堂资源在线 | 一区二区三区美女 | 国产精品天堂 | 亚洲男人第一天堂 | 国产一级片在线 | 亚洲av成人无码久久精品老人 | 亚洲熟妇无码一区二区三区导航 | 国产乱码一区二区三区 | 3d动漫精品啪啪一区二区竹菊 | 三上悠亚一区二区在线观看 | 91操视频| 未满十八18禁止免费无码网站 | 噜噜噜久久 | www国产无套内射com | 香蕉啪啪网 | 午夜视频导航 | 日韩爽爽视频 | 欧美黄色大片在线观看 | 精品无码久久久久久国产 | xxxx在线视频 | 韩日黄色| 国产一区二区三区视频免费在线观看 | 草碰在线视频 | 大屁股白浆一区二区三区 | 中文一区二区在线 | 97超碰国产精品无码蜜芽 | 69精品一区二区三区 | 日韩视频在线观看视频 | 亚洲精品国产a | 国产一级在线播放 | 国产粉嫩在线 | 男受被做哭激烈娇喘gv视频 | 性高潮久久久久久 | 捆绑凌虐一区二区三区 | 欧美日韩加勒比 | 91视频在线网站 | 亚洲狠狠爱| 色眯眯av| h在线| av在线播放地址 | 少妇婷婷| 欧美精品一区二区不卡 | 精品一区免费观看 | 久久久久久久一区二区 | 亚洲一区二区不卡视频 | 又大又硬又爽免费视频 | jizz中国女人| 狠狠干in | 国产精品久久免费 | 欧美黑人猛交 | 狠狠地日 | 日韩精品一区二区亚洲av性色 | 午夜影视在线观看 | 国产青青视频 | 久久二区三区 | 黄色污网站在线观看 | 亚洲在线电影 | 亚洲欧美日韩视频一区 | 91香蕉黄| 免费黄色小说视频 | 夜夜嗨视频 | 尤物网站在线观看 | 夜夜嗨国产 | a级全黄| 色妞网 | 日韩av不卡一区二区 | 国产精品视频观看 | 男人的天堂av片 | 视频一区中文字幕 | 极品人妻一区二区 | 喷潮在线 | 黄色欧美网站 | 黄av在线| 一级福利视频 | 国产精品久久综合青草亚洲AV | 亚洲国产精品国自产拍久久 | 深夜福利免费视频 | 国产喷水福利在线视频 | 色久月| 扒下小娇妻的内裤打屁股 | 91高清免费视频 | 男人天堂欧美 | 热久久亚洲 | 国产精品边吃奶边做爽 | 色涩久久| 午夜激情视频网站 | 国产中文在线视频 | 免费在线视频一区二区 | 99精品视频免费在线观看 | 中文字幕无码精品亚洲资源网久久 | 台湾150部性三级 | 免费网站在线观看视频 | 国产精品尤物视频 | 欧美激情精品久久久久久蜜臀 | 国产成人精品白浆久久69 |