主鍵由外部程序負責生成,在save()之前必須指定一個,Hibernate不負責維護主鍵生成。與Hibernate和底層數據庫都無關,可以跨數據庫。
<id name="groupid" column="GROUPID"> <generator class="assigned" /></id>采用數據庫提供的sequence機制生成主鍵,需要數據庫支持sequence 如Oracle、DB2。MySQL不支持
<id name="groupid" column="GROUPID"> <generator class="sequence"> <param name="sequence">hibernate_id</param> </generator></id>Hibernate生成主鍵時,查找sequence并賦給主鍵值,主鍵值由數據庫生成,Hibernate不負責維護,使用時必須先創建一個sequence,如果不指定sequence名稱,則使用Hibernate默認的sequence,名稱為hibernate_sequence,前提要在數據庫中創建該sequence。
identity由底層數據庫生成標識符。identity是由數據庫自己生成的,但這個主鍵必須設置為自增長,使用identity的前提條件是底層數據庫支持自動增長字段類型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle這類沒有自增字段的則不支持。
<id name="groupid" column="GROUPID"> <generator class="identity" /></id>如果使用MySQL數據庫,則主鍵字段必須設置成auto_increment
id int(11) PRimary key auto_incrementnative由hibernate根據使用的數據庫自行判斷采用identity、hilo、sequence其中一種作為主鍵生成方式,靈活性很強。如果能支持identity則使用identity,如果支持sequence則使用sequence。
<id name="groupid" column="GROUPID"> <generator class="native" /></id>例如:MySQL使用identity,Oracle使用sequence
UUID:Universally Unique Identifier,是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。
<id name="groupid" column="GROUPID"> <generator class="uuid" /></id>Hibernate在保存對象時,生成一個UUID字符串作為主鍵,保證了唯一性,但其并無任何業務邏輯意義,只能作為主鍵,唯一缺點長度較大,32位(Hibernate將UUID中間的”-“刪除了)的字符串,占用存儲空間大,但是有兩個很重要的優點,Hibernate在維護主鍵時,不用去數據庫查詢,從而提高效率,而且它是跨數據庫的,以后切換數據庫極其方便。
特點:uuid長度大,占用空間大,跨數據庫,不用訪問數據庫就生成主鍵值,所以效率高且能保證唯一性,移植非常方便,推薦使用。
以上為Hibernate常用的自帶生成策略,也包括increment、hilo、guid、foreign等等
手動指定用assignedOracle用sequenceMySQL用identity更靈活用native推薦使用UUID作者:itmyhome
新聞熱點
疑難解答