激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java探索之Hibernate主鍵生成策略詳細介紹

Java探索之Hibernate主鍵生成策略詳細介紹

2021-01-24 11:44不知不覺已變淡 Java教程

這篇文章主要介紹了Java探索之Hibernate主鍵生成策略詳細介紹,具有一定參考價值,需要的朋友可以了解下。

1.increment

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

?
1
2
3
<id name="id" column="id">
<generator class="increment" />
</id>

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

特點:跨數據庫,不適合多進程并發更新數據庫,適合單一進程訪問數據庫,不能用于群集環境。

2.sequence

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

?
1
2
3
<generator class="sequence">
<param name="sequence">hibernate_id</param>
</generator>

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

Hibernate生成主鍵時,查找sequence并賦給主鍵值,主鍵值由數據庫生成,Hibernate不負責維護,使用時必須先創建一個sequence,如果不指定sequence名稱,則使用Hibernate默認的sequence,名稱為hibernate_sequence,前提要在數據庫中創建該sequence。

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

3.identity

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

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

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

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

4.native

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

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

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

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

5.uuid

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

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

其中每個 x 是 0-9 或 a-f 范圍內的一個十六進制的數字。

?
1
2
3
<id name="id" column="id">
<generator class="uuid" />
</id>

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

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

6.guid

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

?
1
2
3
<id name="id" column="id">
<generator class="guid" />
</id>

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

注意:長度因數據庫不同而不同

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

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

7.foreign

    使用另外一個相關聯的對象的主鍵作為該對象主鍵。主要用于一對一關系中。

?
1
2
3
4
5
6
<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的主鍵作為本類映射的主鍵。

特點:很少使用,大多用在一對一關系中。

總結

以上就是本文關于Java探索之Hibernate主鍵生成策略詳細介紹的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,歡迎交流討論。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/kdc18333608478/article/details/52752247

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天天透天天狠天天爱综合97 | 国产精品久久久久久久不卡 | 国产欧美日韩二区 | 草草视频在线播放 | 视频一区二区三区中文字幕 | 超碰97最新| 欧美精品成人一区二区在线观看 | 国产一区二区三区高清 | 国产高清成人久久 | 羞羞网站| 国产1区2区3区中文字幕 | 一区二区三高清 | 久国产| 综合精品在线 | 久久精品一区二区三区不卡牛牛 | 成人男女激情免费视频 | 在线观看一二区 | 国产日韩大片 | 斗罗破苍穹在线观看免费完整观看 | 中文亚洲视频 | 国产在线精品一区二区 | 免费一级a毛片在线播放视 日日草夜夜操 | 欧美性生交大片 | 欧美成在线视频 | 国产一区免费 | 中文字幕偷拍 | 久草在线视频免费播放 | 久久久久国产一区二区三区不卡 | 19禁国产精品福利视频 | 亚洲一区二区在线视频 | 久久中文字幕在线观看 | 欧美日韩一区三区 | 久久精品伊人网 | 欧美交在线 | www.99热视频 | 日本视频在线播放 | 精品国产91久久久久久 | 免费91在线 | 精品一区二区三区免费毛片 | 96视频在线免费观看 | 成人三级电影网站 |