Hibernate中標識符的類型和應用詳解

標識符生成器                              描述
Increment 適用於代理主鍵。      由hibernate自動以遞增的方式生成標識符,每次增量爲1
Identity 適用於代理主鍵。         由底層數據庫生成標識符。條件是數據庫支持自動增長數據類型。
Sequence 適用於代理主鍵。      Hibernate根據底層數據庫序列生成標識符。條件是數據庫支持序列。
Hilo 適用於代理主鍵。               Hibernate根據hign/low算法生成標識符。Hibernate把特定表的字段作爲“hign”值。  默認情況下,採用hibernate_unique_key表的next_hi字段。


Native 適用於代理主鍵。           根據底層數據庫對自動生成標識符的能力來選擇identity、sequence、hilo
Uuid.hex 適用於代理主鍵。         Hibernate採用128位的UUID算法來生成標識符。該算法能夠在網絡環境中生成唯一的字符串標識符,這種策略並不流行,因爲字符串類型的主鍵比整數類型的主鍵佔用更多的數據庫空間。


assigned 適用於自然主鍵。        由java程序負責生成標識符。不能把setID()方法聲明爲Private的。儘量避免使用自然主鍵。

 

====================

ncrement:使用increment方式時,hibernate將按照遞增的方式設定主鍵,具體的方式是,先獲取當前記錄主鍵的最大值,然後再將該值加1作爲主鍵。

select max(id) from table;

<id name=“id” type=“long” column=“ID”>
      <generator class=“increment”/>
</id>
適用範圍:
1。由於不依賴與底層數據庫,適合所有的數據庫系統。
2。單個進程訪問同一個數據庫的場合,集羣環境下不推薦適用。
3。OID必須爲long、int或short類型,如果把OID定義爲byte類型,拋異常。

====================

Identity:identity方式表示數據庫的主鍵生成方式爲採用數據庫的主鍵生成機制,例如SQL Server或MySQL的自動主鍵生成機制。
  由底層數據庫生成標識符.需要把字段定義成自增型。
  my sql 中爲auto_increment
  ms sql server中爲identity
  <generator  class=“identity” />
//////////////////////////////////////////
使用mysql
      <generator class="identity">
           <param name="identity">auto_increment</param>
      </generator>
mysql表:
create table CUSTOMER(
     ID int  NOT NULL auto_increment primary key,
     NAME varchar(15) not null,
     EMAIL varchar(128) not null
);

====================

Sequence:這種方式針對由序列方式產生主鍵的數據庫,例如Oracle。在<generator>的子元素<param name=“sequence”>指定用作產生
    主鍵的序列名稱。
<id name=“id” type=“long” column=“ID”>
      <generator class=“sequence”>
              <param name=“sequence”>tester_id_seq</param>
      </generator>
</id>

適用範圍:
底層數據庫要支持序列。Oracle DB2 SAP等。
OID必須爲long、int或shot類型,如果把OID定義爲byte類型,運行時拋異常。

====================

Hilo:Hilo標識符生成器由Hibernate按照一種hign/low算法來生成標識符,它從數據庫的特定表的字段中獲取high值。
<id name=“id” type=“long” column=“ID”>
     <generator name=“hilo”>
             <param name=“table”>hi_value</param>
             <param name=“column”>next_value</param>
             <param name=“max_lo”>100</param>
     </generator>
</id>

使用範圍:
該機制不依賴於底層數據庫,因此適用於所有的數據庫系統。
OID必須爲long、int、short類型,如果爲byte類型的話,會拋出異常。
org.hibernate.id.IdentifierGeneratorException:this id generator generates
Long、integer、short。

====================

Native:native方式意味着將主鍵的生成機制交由Hibernate決定,Hibernate會根據配置文件中的方言(Dialect)定義,採用不同的數據庫特定的主鍵生成方式。

<id name=“id” type=“native” column=“ID”>
      <generator class=“native” />
</id>

 

適用範圍:
該類型能根據底層數據庫系統的類型,自動選擇合適的標識符生成器,因此很適合於跨數據
庫的平臺,即在同一個應用中需要連接多種數據庫系統的場合。
OID必須爲long、int、short類型,如果爲byte類型的話,會拋出異常。
Org.hibernate.id.IdentifierGeneratorException:this id generator generates
Long、integer、short。

====================

assinged:assinged方式意味着將主鍵的生成機制交由應用程序自己控制。只需要在持久化之前傳入對象主鍵值即可。

<id name=“id” column=“ID”>
      <generator class=“assinged” />
</id>

====================

推薦的

hibernate增強的標識符生成器:org.hibernate.id.enhanced.TableGenerator:這個生成器定義了一個可以利用多個不同的鍵值記錄存儲大量不同增量值的表。

table_name(可選 — 默認是 hibernate_sequences):所用的表的名稱
value_column_name(可選 — 默認爲 next_val):用於存儲這些值的表的字段的名字
segment_column_name(可選,默認爲 sequence_name):用於保存 "segment key" 的字段的名

segment_value(可選,默認爲 default):我們爲這個生成器獲取增量值的 segment 的
"segment key"
initial_value(可選 — 默認是 1):從表裏獲取的初始值
increment_size(可選 — 默認是 1):對錶隨後的調用應該區分的值


<id name="id" type="long" column="id">
 <generator class="org.hibernate.id.enhanced.TableGenerator">
  <param name="segment_value">customer</param>
 </generator>
</id>

====================

映射覆合主鍵

<composite-id>
            <key-property name="firstname" type="java.lang.String">
                <column name="FIRSTNAME" length="16" />
            </key-property>
            <key-property name="lastname" type="java.lang.String">
                <column name="LASTNAME" length="16" />
            </key-property>
  </composite-id>

 

可以使用StudentsinfoId屬性來設置聯合主鍵
 <composite-id name="id" class="com.oristand.StudentsinfoId">
            <key-property name="firstname" type="java.lang.String">
                <column name="FIRSTNAME" length="16" />
            </key-property>
            <key-property name="lastname" type="java.lang.String">
                <column name="LASTNAME" length="16" />
            </key-property>
 </composite-id>
使用聯合主鍵的持久化類需要實現serializable接口和覆蓋equals()、
 hashCode()方法。

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