最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java探索之Hibernate主鍵生成策略詳細(xì)介紹

 更新時間:2017年10月25日 08:45:33   作者:不知不覺已變淡  
這篇文章主要介紹了Java探索之Hibernate主鍵生成策略詳細(xì)介紹,具有一定參考價值,需要的朋友可以了解下。

1.increment

     由Hibernate從數(shù)據(jù)庫中去除主鍵的最大值(每個session只取一次),以該值為基礎(chǔ),每次增量為1,在內(nèi)存中生成主鍵,不依賴于底層的數(shù)據(jù)庫,因此可以跨數(shù)據(jù)庫。

<id name="id" column="id">
<generator class="increment" />
</id>

Hibernate調(diào)用org.hibernate.id.IncrementGenerator類里面的generate()方法,使用select max(idColumnName) from tableName語句獲取主鍵最大值。該方法被聲明成了synchronized,所以在一個獨立的Java虛擬機內(nèi)部是沒有問題的,然而,在多個JVM同時并發(fā)訪問數(shù)據(jù)庫select max時就可能取出相同的值,再insert就會發(fā)生Dumplicate entry的錯誤。所以只能有一個Hibernate應(yīng)用進程訪問數(shù)據(jù)庫,否則就可能產(chǎn)生主鍵沖突,所以不適合多進程并發(fā)更新數(shù)據(jù)庫,適合單一進程訪問數(shù)據(jù)庫,不能用于群集環(huán)境。

特點:跨數(shù)據(jù)庫,不適合多進程并發(fā)更新數(shù)據(jù)庫,適合單一進程訪問數(shù)據(jù)庫,不能用于群集環(huán)境。

2.sequence

采用數(shù)據(jù)庫提供的sequence機制生成主鍵,需要數(shù)據(jù)庫支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL這種不支持sequence的數(shù)據(jù)庫則不行(可以使用identity)。

<generator class="sequence">
<param name="sequence">hibernate_id</param>
</generator>

<param name="sequence">hibernate_id</param> 指定sequence的名稱

Hibernate生成主鍵時,查找sequence并賦給主鍵值,主鍵值由數(shù)據(jù)庫生成,Hibernate不負(fù)責(zé)維護,使用時必須先創(chuàng)建一個sequence,如果不指定sequence名稱,則使用Hibernate默認(rèn)的sequence,名稱為hibernate_sequence,前提要在數(shù)據(jù)庫中創(chuàng)建該sequence。

特點:只能在支持序列的數(shù)據(jù)庫中使用,如Oracle。

3.identity

identity由底層數(shù)據(jù)庫生成標(biāo)識符。identity是由數(shù)據(jù)庫自己生成的,但這個主鍵必須設(shè)置為自增長,使用identity的前提條件是底層數(shù)據(jù)庫支持自動增長字段類型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle這類沒有自增字段的則不支持。

<id name="id" column="id">
<generator class="identity" />
</id>

例:如果使用MySQL數(shù)據(jù)庫,則主鍵字段必須設(shè)置成auto_increment。
id int(11) primary key auto_increment

特點:只能用在支持自動增長的字段數(shù)據(jù)庫中使用,如MySQL。

4.native

    native由hibernate根據(jù)使用的數(shù)據(jù)庫自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式,靈活性很強。如果能支持identity則使用identity,如果支持sequence則使用sequence。

<id name="id" column="id">
<generator class="native" />
</id>

例如MySQL使用identity,Oracle使用sequence
注意:如果Hibernate自動選擇sequence或者hilo,則所有的表的主鍵都會從Hibernate默認(rèn)的sequence或hilo表中取。并且,有的數(shù)據(jù)庫對于默認(rèn)情況主鍵生成測試的支持,效率并不是很高。
使用sequence或hilo時,可以加入?yún)?shù),指定sequence名稱或hi值表名稱等,如
<param name="sequence">hibernate_id</param>

    特點:根據(jù)數(shù)據(jù)庫自動選擇,項目中如果用到多個數(shù)據(jù)庫時,可以使用這種方式,使用時需要設(shè)置表的自增字段或建立序列,建立表等。

5.uuid

    UUID:Universally Unique Identifier,是指在一臺機器上生成的數(shù)字,它保證對在同一時空中的所有機器都是唯一的。按照開放軟件基金會(OSF)制定的標(biāo)準(zhǔn)計算,用到了以太網(wǎng)卡地址、納秒級時間、芯片ID碼和許多可能的數(shù)字,標(biāo)準(zhǔn)的UUID格式為:

xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)

其中每個 x 是 0-9 或 a-f 范圍內(nèi)的一個十六進制的數(shù)字。

<id name="id" column="id">
<generator class="uuid" />
</id>

Hibernate在保存對象時,生成一個UUID字符串作為主鍵,保證了唯一性,但其并無任何業(yè)務(wù)邏輯意義,只能作為主鍵,唯一缺點長度較大,32位(Hibernate將UUID中間的“-”刪除了)的字符串,占用存儲空間大,但是有兩個很重要的優(yōu)點,Hibernate在維護主鍵時,不用去數(shù)據(jù)庫查詢,從而提高效率,而且它是跨數(shù)據(jù)庫的,以后切換數(shù)據(jù)庫極其方便。

    特點:uuid長度大,占用空間大,跨數(shù)據(jù)庫,不用訪問數(shù)據(jù)庫就生成主鍵值,所以效率高且能保證唯一性,移植非常方便,推薦使用。

6.guid

    GUID:Globally Unique Identifier全球唯一標(biāo)識符,也稱作 UUID,是一個128位長的數(shù)字,用16進制表示。算法的核心思想是結(jié)合機器的網(wǎng)卡、當(dāng)?shù)貢r間、一個隨即數(shù)來生成GUID。從理論上講,如果一臺機器每秒產(chǎn)生10000000個GUID,則可以保證(概率意義上)3240年不重復(fù)。

<id name="id" column="id">
<generator class="guid" />
</id>

Hibernate在維護主鍵時,先查詢數(shù)據(jù)庫,獲得一個uuid字符串,該字符串就是主鍵值,該值唯一,缺點長度較大,支持?jǐn)?shù)據(jù)庫有限,優(yōu)點同uuid,跨數(shù)據(jù)庫,但是仍然需要訪問數(shù)據(jù)庫。

注意:長度因數(shù)據(jù)庫不同而不同

MySQL中使用select uuid()語句獲得的為36位(包含標(biāo)準(zhǔn)格式的“-”)
Oracle中,使用select rawtohex(sys_guid()) from dual語句獲得的為32位(不包含“-”) 

    特點:需要數(shù)據(jù)庫支持查詢uuid,生成時需要查詢數(shù)據(jù)庫,效率沒有uuid高,推薦使用uuid。

7.foreign

    使用另外一個相關(guān)聯(lián)的對象的主鍵作為該對象主鍵。主要用于一對一關(guān)系中。

<id name="id" column="id">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user" class="domain.User" constrained="true" />

該例使用domain.User的主鍵作為本類映射的主鍵。

特點:很少使用,大多用在一對一關(guān)系中。

總結(jié)

以上就是本文關(guān)于Java探索之Hibernate主鍵生成策略詳細(xì)介紹的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Hibernate實現(xiàn)悲觀鎖和樂觀鎖代碼介紹詳細(xì)解讀Hibernate的緩存機制等,有什么問題可以隨時留言,歡迎交流討論。感謝朋友們對本站的支持!

相關(guān)文章

  • Java中的?CyclicBarrier詳解

    Java中的?CyclicBarrier詳解

    這篇文章主要介紹了Java中的?CyclicBarrier詳解,CyclicBarrier沒有顯示繼承哪個父類或者實現(xiàn)哪個父接口,?所有AQS和重入鎖不是通過繼承實現(xiàn)的,而是通過組合實現(xiàn)的,下文相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • SpringBoot整合GRPC微服務(wù)遠程通信的實現(xiàn)示例

    SpringBoot整合GRPC微服務(wù)遠程通信的實現(xiàn)示例

    本文主要介紹了SpringBoot整合GRPC微服務(wù)遠程通信的實現(xiàn)示例,包含gRPC的工作原理,以及如何在Spring Boot應(yīng)用中集成gRPC,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Spring源碼解析 Bean屬性填充

    Spring源碼解析 Bean屬性填充

    這篇文章主要介紹了Spring源碼解析 Bean屬性填充,文章圍繞主題展開想詳細(xì)的內(nèi)容詳情,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • springboot配置加密的正確姿勢分享

    springboot配置加密的正確姿勢分享

    在Spring boot開發(fā)中,需要在application.yml文件里配置數(shù)據(jù)庫的連接信息,或者在啟動時傳入數(shù)據(jù)庫密碼,如果不加密,傳明文,數(shù)據(jù)庫就直接暴露了,下面這篇文章主要給大家介紹了關(guān)于springboot配置加密的正確姿勢,需要的朋友可以參考下
    2022-11-11
  • Spring Boot項目利用Redis實現(xiàn)集中式緩存實例

    Spring Boot項目利用Redis實現(xiàn)集中式緩存實例

    本篇文章主要介紹了Spring Boot項目利用Redis實現(xiàn)集中式緩存實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Spring Boot 開發(fā)環(huán)境熱部署詳細(xì)教程

    Spring Boot 開發(fā)環(huán)境熱部署詳細(xì)教程

    這篇文章主要介紹了Spring Boot 開發(fā)環(huán)境熱部署,本文給大家介紹了Spring Boot 開發(fā)環(huán)境熱部署的原理及快速配置方法,通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Spring Batch 入門示例

    Spring Batch 入門示例

    本文將向您展示如何使用Spring Boot創(chuàng)建一個的Spring Batch的Hello World示例。對和我一樣入門的有一定的幫助,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java代碼如何判斷l(xiāng)inux系統(tǒng)windows系統(tǒng)

    Java代碼如何判斷l(xiāng)inux系統(tǒng)windows系統(tǒng)

    這篇文章主要介紹了Java代碼如何判斷l(xiāng)inux系統(tǒng)windows系統(tǒng)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • MyBatis-Plus主鍵生成策略的實現(xiàn)方法

    MyBatis-Plus主鍵生成策略的實現(xiàn)方法

    MyBatis-Plus提供了多種主鍵生成策略,包括自增、UUID、Redis和雪花算法,本文就來介紹一下,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Java方法的參數(shù)傳遞機制實例詳解

    Java方法的參數(shù)傳遞機制實例詳解

    這篇文章主要介紹了Java方法的參數(shù)傳遞機制,結(jié)合實例形式詳細(xì)分析了java方法參數(shù)傳遞機制原理、實現(xiàn)方法及操作注意事項,需要的朋友可以參考下
    2019-09-09

最新評論

屯昌县| 沅江市| 惠州市| 岑溪市| 泗水县| 三门峡市| 河津市| 双江| 周口市| 盐源县| 类乌齐县| 定襄县| 湖南省| 永仁县| 伊通| 本溪市| 连山| 邢台市| 广平县| 潜江市| 黄冈市| 平和县| 松桃| 澎湖县| 富宁县| 菏泽市| 邯郸市| 师宗县| 象山县| 金乡县| 波密县| 恭城| 承德县| 麻城市| 福安市| 华蓥市| 昌平区| 京山县| 丁青县| 彰化县| 集贤县|