【hibernate框架7】hibernate的ID的生成策略剖析

1.設置id的原因

我們表裏面一般有一個id作爲主鍵,一般id不需要手動去傳值的。


在實際工作中,在數據庫中建表的時候,id在數據庫中都是設置成自增字段。


對於類的對象裏面的字段,就無法指定自增,需要靠程序自動的生成或者靠數據庫來幫我們自動的生成。


Jpa/hibernate就已經實現了這樣的能力,你可以通過設置來告訴它id怎麼樣生成,這樣你寫程序的時候就不用設置id了,這就叫“id的生成策略”。

2.讓數據庫自動生成id的方法

在實體類的xml配置文件中,有:
 

<id
        name="(1)propertyName"
        type="(2)typename"
        column(3)="column_name"
        unsave(4)d-value="null|any|none|undefined|id_value"
        access(5)="field|property|ClassName">
        node="element-name|@attribute-name|element/@attribute|."
 
 
        <generator class="generatorClass"/>
</id>

這裏的<generator class="generatorClass"/>,就是一個id的生成器。


generator可以有各種各樣的值,每個值指定了它的生成方式。
我們利用generator裏面的某種生成方式來生成一個隨機的id字段、。


生成方式有以下幾種:
1.increment
用於爲 long, short 或者 int 類型生成 唯一標識。只有在沒有其他進程往同一張表中插入數據時才能使用。在集羣下不要使用。


2.identity
對 DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 的內置標識字段提供支持。返回的標識符是 long,short 或者 int 類型的。


3.sequence
在 DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列(sequence), 而在 Interbase 中使用生成器(generator)。返回的標識符是 long,short 或者 int 類型的。


4.hilo
使用一個高/低位算法高效的生成 long,short 或者 int 類型的標識符。給定一個表和字段(默認分別是 hibernate_unique_key 和 next_hi)作爲高位值的來源。高/低位算法生成的標識符只在一個特定的數據庫中是唯一的。


5.seqhilo
使用一個高/低位算法來高效的生成 long,short 或者 int 類型的標識符,給定一個數據庫序列(sequence)的名字。


6.uuid算法
UUID 包含:IP 地址、JVM 的啓動時間(精確到 1/4 秒)、系統時間和一個計數器值(在 JVM 中唯一)。 在 Java 代碼中不可能獲得 MAC 地址或者內存地址,所以這已經是我們在不使用 JNI 的前提下的能做的最好實現了。


7.uuid2


8.guid
在 MS SQL Server 和 MySQL 中使用數據庫生成的 GUID 字符串。


9.native
根據底層數據庫的能力選擇 identity、sequence 或者 hilo 中的一個。


10.assigned
讓應用程序在調用 save() 之前爲對象分配一個標識符。這是 <generator> 元素沒有指定時的默認生成策略。


11.select
通過數據庫觸發器選擇一些唯一主鍵的行並返回主鍵值來分配一個主鍵。


12.foreign
使用另外一個相關聯的對象的標識符。它通常和 <one-to-one> 聯合起來使用。


13.sequence-identity
一種特別的序列生成策略,它使用數據庫序列來生成實際值,但將它和 JDBC3 的 getGeneratedKeys 結合在一起,使得在插入語句執行的時候就返回生成的值。目前爲止只有面向 JDK 1.4 的 Oracle 10g 驅動支持這一策略。由於 Oracle 驅動程序的一個 bug,這些插入語句的註釋被關閉了。


下面就用uuid算法在java實體類中生成數據庫表的id主鍵:
詳見我的文章:
《XML生成id的方法之uuid算法生成隨機id》 鏈接:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章