[Hibernate開發之路](4)ID建置原則

來源:互聯網
上載者:User

標籤:water   uid   cell   ber   beans   keyword   student   應用   otto   

一 對象關聯式資料庫映射之Id

被映射的類必須定義相應資料庫表主鍵欄位。大多數類有一個JavaBeans風格的屬性, 為每個執行個體包括唯一的標識。

<id> 元素定義了該屬性到資料庫表主鍵欄位的映射。

 

<id        name="propertyName"        type="typename"        column="column_name"        unsaved-value="null|any|none|undefined|id_value"        access="field|property|ClassName"        node="element-name|@attribute-name|element/@attribute|.">        <generator class="generatorClass"/></id>


這裡主要解說ID建置原則即generator的使用方法

二  Generator( ID建置原則)

可選的<generator>子項目是一個Java類的名字。 用來為該持久化類的執行個體產生唯一的標識。假設這個產生器執行個體須要某些配置值或者初始化參數, 用<param>元素來傳遞。

 

<id name="id" type="long" column="cat_id">        <generator class="org.hibernate.id.TableHiLoGenerator">                <param name="table">uid_table</param>                <param name="column">next_hi_value_column</param>        </generator></id>
全部的產生器都實現org.hibernate.id.IdentifierGenerator介面。 這是一個非常easy的介面;某些應用程式能夠選擇提供他們自己特定的實現。當然, Hibernate提供了非常多內建的實現。以下是一些內建產生器的快捷名字: 

(1)uuid 

用一個128-bit的UUID演算法產生字串類型的標識符, 這在一個網路中是唯一的(使用了IP地址)。UUID被編碼為一個32位16進位數位字串。

採用XML配置方式

<hibernate-mapping><class name="com.model.StudentInfo" table="StudentInfo"><id name="id" column="ID">            <generator class="uuid"/>        </id><property name="name" column = "Name"/><property name="age" column = "Age"/><property name="sex" column = "Sex"/>    </class></hibernate-mapping>

自己主動產生ID:



採用uuid方式自己主動產生的ID為string類型




(2)native

依據不同的資料庫採用不同的ID產生方式,比如:在SQL Server中採用identity; 在MySQL中採用auto_increment; 在ORACLE中就會採用sequence, 注意hibernate會自己主動幫你建立一個名字叫hibernate_sequence的序列,不用自己去建立.這也是最經常使用和省事的.

採用XML配置方式

<hibernate-mapping><class name="com.model.StudentInfo" table="StudentInfo"><id name="id" column="ID">            <generator class="native"/>        </id><property name="name" column = "Name"/><property name="age" column = "Age"/><property name="sex" column = "Sex"/>    </class></hibernate-mapping>

採用註解方式:

@Entitypublic class StudentInfo {private int id;@Id@GeneratedValue(strategy = GenerationType.AUTO)  public int getId() {return id;}public void setId(int id) {this.id = id;}}


自己主動產生ID:



(3)identity

對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內建識別欄位提供支援。

返回的標識符是long, short 或者int類型的。 

這樣的策略在採用SQL Server時,相當於SQL Server的identitykeyword, 在採用mysql時相當於MySql的auto_incrementkeyword,不能用在Oracle中.

採用XML配置方式:

<hibernate-mapping><class name="com.model.StudentInfo" table="StudentInfo"><id name="id" column="ID">            <generator class="identity"/>        </id><property name="name" column = "Name"/><property name="age" column = "Age"/><property name="sex" column = "Sex"/>    </class></hibernate-mapping>
採用註解方式:

@Entitypublic class StudentInfo {private int id;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)  public int getId() {return id;}public void setId(int id) {this.id = id;}}

(4)sequence

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

採用XML配置方式:

<hibernate-mapping><class name="com.model.StudentInfo" table="StudentInfo"><id name="id" column="ID">            <generator class="sequence">            <param name="sequence">student_sequence</param>            </generator>        </id>                ......            </class></hibernate-mapping>

採用註解方式:

@Entity@SequenceGenerator(name = "StudentInfoSEQ", sequenceName = "StudentInfoSEQ_DB") public class StudentInfo {private int id;@Id@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "StudentInfoSEQ")  public int getId() {return id;}public void setId(int id) {this.id = id;}}


在類的前面寫

@Enterty

@SequenceGenerator(name="", sequenceName="")//sequence產生器。第一個參數是產生器的名字。第二個參數指的是產生到資料庫裡面的sequence的名字

在主鍵的個頭方法前寫:

@Id

@GeneratedValue(strategy=GenerationType.Sequence , generator="上面定義的產生器的名字")//指定產生器的策略

(5)hilo 

使用一個高/低位演算法高效的產生long, short 或者 int類型的標識符。

給定一個表和欄位(預設各自是 hibernate_unique_key 和next_hi)作為高位值的來源。

高/低位演算法產生的標識符僅僅在一個特定的資料庫中是唯一的。


(6)seqhilo 使用一個高/低位演算法來高效的產生long, short 或者 int類型的標識符。給定一個資料庫序列(sequence)的名字。

(7)increment 用於為long, short或者int類型產生 唯一標識。

僅僅有在沒有其它進程往同一張表中插入資料時才幹使用。

在叢集下不要使用。 

(8)table

使用一張資料表來管理全部的資料表的主鍵產生,這個最為麻煩,可是用得好會很方便,尤其是大型項目,資料表許多的時候.這裡僅僅舉註解的範例

@Entity@TableGenerator(name = "StudentInfo_TG",table = "TableGenerator_Table",pkColumnName = "key",valueColumnName = "value",pkColumnValue = "StudentInfo",allocationSize = 1)public class StudentInfo {private int id;@GeneratedValue(strategy = GenerationType.TABLE, generator = "StudentInfo_TG")  public int getId() {return id;}public void setId(int id) {this.id = id;}}

@TableGenerator表示這個表要採用table的id產生方式,括弧裡的各個參數說明:
name表示產生器的名字,在隨後實體的ID中要指明.
table表示在資料庫中產生的管理ID建置原則的表的名字.
pkColumnName   表欄位名稱 表示主鍵的名字
pkColumnValue  表欄位名稱 表示主鍵的值


valueColumnName 表示這個表要記錄的主鍵的名字,比如這裡是StudentInfo,那麼在StudentInfo_TG表中就用StudentInfo來記錄當前ID值
allocationSize  表示每次取得一個ID的值之後增長的步長值,這裡是每次遞增1.

表結構:

key value
StudentInfo 2

每次須要主鍵值時,查詢名為"TableGenerator_Table"的表,尋找欄位"key"值為"StudentInfo"的記錄,得到這條記錄的"value"值為2,依據這個值,和allocationSize的值產生主鍵值。


實際上能夠理解為:

select value from TableGenerator_Table where key = ‘StudentInfo‘






[Hibernate開發之路](4)ID建置原則

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.