Hibernate提供的內置標識符生成器
Java語言按內存地址來識別或區分同一個類的不同對象,而關系數據庫按主鍵來識別或區分同一個表的不同記錄。Hibernate使用OID(對象標識符)來統一兩者之間的矛盾,OID是關系數據庫中的主鍵(通常稱為代理主健)在Java對象模型中的等價物。
在對象-關系映射文件中,<id>元素用來設置對象標識符,比如:
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity" />
</id>
<generator>元素用來設定標識生成器。Hibernate提供了標識符生成器接口: org.hibernate.id.IdentifierGenerator接口;并且提供了多種內置的實現。例如: org.hibernate.id.IdentityGenerator;org.hibernate.id.IncrementGenerator;它們的縮寫名分別為:identity和increment。在設置<generator>子元素的class屬性時,既可以提供完整的標識符生成器的類名,也可以給定縮寫名,因此以下兩種方式是等價的。
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="org.hibernate.id.IdentityGenerator" />
</id>
或者:
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity" />
</id>
標識符生成器 |
說 明 |
increment |
適用于代理主鍵。由Hibernate自動以遞增的方式生成標識符,每次增加1。 |
identity |
適用于代理主鍵。由底層數據庫生成標識符。前提條件是底層數據庫支持自動增長字段類型。(oracle數據庫不能用它) |
sequence |
適用于代理主鍵。Hibernate根據底層數據庫的序列來生成標識符。前提條件是底層數據庫支持序列。(oracle數據庫能用它) |
hilo |
適用于代理主鍵。Hibernate根據high/low算法來生成標識符。Hibernate把特定表的字段作為"high"值.在默認情況下選用hibernate_unique_key表的next_hi字段。它的機制不依賴于底層數據庫系統,因此它適合于所有的數據庫系統。high/low算法生成的標識符只能在一個數據庫中保證唯一。 |
native |
適用于代理主鍵。根據底層數據庫對自動生成標識符的支持能力,來選擇identity,sequence, hilo。很適合于跨平臺開發,即同一個Hibernate應用需要連接多種數據庫系統。 |
uuid.hex |
適用于代理主鍵。Hibernate采用128位的UUID算法來生成標識符。UUID算法能夠在網絡環境中生成唯一的字符串標識符。這種標識符生成策略并不流行,因為字符串類型的主鍵比整數類型的主鍵占用更多的數據庫空間。 |
assigned |
適用于自然主鍵。由Java應用程序負責生成標識符,為了能讓Java應用程序設置OID,不能把setID()方法聲明為private類型,應該盡量避免使用自然主鍵。 |
1 代理主鍵:
注意: 不具有義務含義,所以它可以適應不斷變化的業務需求,它通常為整數類型,比如short、long、int,以及它們的包裝類型。
2 自然主鍵:
具有業務含義。
3 幾種常用數據庫系統中可使用的標識符生成器:
MYSQL:identity、increment、hiho、native
MS SQL Server:identity、increment、hiho、native
Oracle:sequence、identity、increment、hiho、native
跨平臺開發:native
幾個例子:
1、如果主鍵字段為自增類型,
那么對應的.hbm.xml文件中的id字段的xml聲明,
應該這么寫:
<generator class="native" />
例如:
<id
column="user_id"
name="Id"
type="integer"
>
<generator class="native" />
</id>
其實這個native并非實際的類型,而是hiberante根據
當前使用的數據庫,自動使用對應的類型。
例如:如果sqlserver,native就對應identity
見Hiberante參考:
native(本地)
根據底層數據庫的能力選擇identity, sequence 或者hilo中的一個。
2、如果主鍵字段不設置為自增,但是int型的
可以使用increment,由hibernate產生主鍵。
<generator class="increment" />
不過這種方法,對于并發量大的應用,似乎最好不要采用。
見hiberante參考:
increment(遞增)
用于為long, short或者int類型生成唯一標識。只有在沒有其他進程往同一張表中插入數據時才能使用。
在集群下不要使用。
3、如果使用uuid.hex產生的隨機32位數最為主鍵
那么數據庫的id字段類型為char,長度為32
hbm.xml中寫為: <generator class="uuid.hex" />
另外,uuid.string也是功能類似。
uuid.hex產生的是32位的16進制數字的字符串。
而uuid.string產生的是16個字符長的任意ASCII字符組成的字符串
見參考:
uuid.hex
用一個128-bit的UUID算法生成字符串類型的標識符。在一個網絡中唯一(使用了IP地址)。UUID被編碼為一個32位16進制數字的字符串。
uuid.string
使用同樣的UUID算法。UUID被編碼為一個16個字符長的任意ASCII字符組成的字符串。不能使用在PostgreSQL數據庫中
文章列表