Hibernate提供的主鍵生成策略,使我們可以在實體類的映射xml文件中設定關鍵字來告訴hibernate我們要使用的主鍵生成方式,然後hibernate會根據設定完成數據庫的主鍵控制。
一、首先通過舉例子來了解實體映射文件(*.hbm.xml)中對id生成策略配置格式
用戶User的實體類User.java
package com.bjpowernode.hibernate;
import java.util.Date;
public class User {
private String id;
private String name;
public User(){}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
User.java對應的映射文件User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.User">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<property name="password"/>
</class>
</hibernate-mapping>
其中
<id name="id" column="表主鍵字段名" type="java.lang.Integer">
<generator class="設置主鍵生成策略類型"/>
</id>
二、Hibernate常用的主鍵生成策略的原理、特點、應用場合
關於映射文件的問題下次再介紹,這次主要總結hibernate常用主鍵生成策略。
(1)increment
a)對主鍵值采取自動順序增長的方式生成新的主鍵,值默認從1開始。
b)原理:在當前應用實例中維持一個變量,以保存當前最大值,之後每次需要生成主鍵值的時候將此值加1作為主鍵.不依賴於底層的數據庫,因此所有的數據庫都可以使用
c)缺點:通過increment的生成主鍵的原理可推斷,此種主鍵生成策略不適用於集群、同一時段大量用戶並發訪問的系統,既當大量用戶同一時間段同時進行插入操作的時候,可能存在取得相同的最大值然後再同時+1的情況,這個時候就會造成主鍵沖突。因此,如果同一數據庫有多個實例訪問,此方式必須避免使用。
(2)UUID
a)原理UUID使用128位UUID算法生成主鍵,能夠保證網絡環境下的主鍵唯一性,也就能夠保證在不同數據庫及不同服務器下主鍵的唯一性。所以使用於所有數據庫。
b)特點;能夠保證數據庫中的主鍵唯一性,但是在生成的主鍵占用比較多的存貯空間
(3)Hilo
a)原理:通過hi/lo 算法(Hilo使用高低位算法生成主鍵,高低位算法使用一個高位值和一個低位值,然後把算法得到的兩個值拼接起來)實現的主鍵生成機制,需要額外的數據庫表保存主鍵生成歷史狀態。
b)特點:需要額外的數據庫表和字段提供高位值來源。默認情況下使用的表是 hibernate_unique_key,默認字段叫作next_hi。next_hi必須有一條記錄否則會出現錯誤。需要額外的數據庫表的支持,能保證同一個數據庫中主鍵的唯一性,但不能保證多個數據庫之間主鍵的唯一性。Hilo主鍵生成方式由Hibernate 維護,所以Hilo方式與底層數據庫無關。
(4)sequence
a)sequence實際是就是一張單行單列的表。
b)實現原理:調用數據庫中底層存在的sequence生成主鍵,需要底層數據庫的支持序列,因此他是依賴於數據庫的。
c)支持sequence的數據庫有:Oracle 、DB2(Mysql/SQlServer不支持)、PostgreSql、SAPDb等
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-07/104404p2.htm