日韩性视频-久久久蜜桃-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标识符属性(主键)生成策略全析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 国产成人久久精品麻豆二区 | 337p日本欧洲亚洲大胆张筱雨 | 91久久电影 | 91丨porny丨海角社区 | 神秘马戏团在线观看免费高清中文 | 色老头在线观看 | 人妻少妇精品视频一区二区三区 | www九色| 国产精品伦理一区二区 | 欧美电影一区二区三区 | 久久国产精品国语对白 | 草久久久久 | 美女精品久久 | 欧美日韩中文字幕视频 | 激情av综合 | 黄色同人网站 | 秋霞在线一区二区 | 综合久久91| 在线色av| 欧美一区在线视频 | 日b视频免费| 国产视频一区二区在线观看 | 最新av在线 | 黄色www视频 | 国产精品7| 天天摸夜夜添 | 国产麻豆91视频 | 亚洲视频一区二区三区四区 | 狠狠撸在线视频 | 免费成人在线网站 | 啪啪一级片 | 欧美激情视频一区二区三区在线播放 | 午夜一区不卡 | 91美女诱惑 | 啪网站| 日韩成人综合网 | 免费黄网在线观看 | 91亚洲成人| 成人黄色小视频 | 午夜电影天堂 | 国产欧美一区二区三区四区 | 亚洲综合一区二区 | ,国产精品国产三级国产 | 91欧美在线视频 | 美女四肢被绑在床扒衣 | 国产区一区二区三 | 少妇被爽到高潮动态图 | 潘金莲一级淫片aaaaa | 爱情岛亚洲品质自拍极速福利网站 | 黄色在线观看网站 | 久久久永久久久人妻精品麻豆 | 亚洲熟妇一区二区三区 | 亚洲午夜av久久乱码 | 欧美丰满美乳xxx高潮www | 一级片99 | 日韩青青草| 国产黄色影视 | 致命弯道8在线观看免费高清完整 | 久久久久久久久免费 | 久久成人a| 人人射av| 成人免费一区二区三区 | 亚洲成av人片久久 | 欧美精品在线免费观看 | 有奶水的迷人少妇 | 大色综合 | 国产精品久久久久久久久久久久久久久久久久 | 在线观看va| 美女脱裤子让男人捅 | 国产欧美在线视频 | 国产1区在线 | 韩国甜性涩爱 | 国产污污视频在线观看 | 浪浪视频在线观看 | 婷婷国产一区 | 国产一区二区三区在线免费观看 | 一二三四区在线 | 国产精品毛片久久久久久久 | 谁有毛片网站 | 久久入口| 少妇高潮惨叫久久久久 | 天海翼中文字幕 | 日韩av网址大全 | 三级黄色在线播放 | 国精产品一品二品国精品69xx | 咪咪色图 | 亚洲无限看 | 91桃色污 | 精品国产乱码久久久久久108 | 丁香四月婷婷 | 色乱码一区二区三区网站 | 女生被男生c | 日本va欧美va欧美va精品 | 亚洲精品在线观看网站 | 国产一区二区三区成人 | 五月激情在线 | 女同hd系列中文字幕 | 亚洲欧美日韩综合在线 | 97超碰国产在线 |