1.Assigned(常用)
Assigned方式由程序生成主鍵值,並且要在save()之前指定,否則會拋出異常。
特點:逐漸的生成值完全由用戶決定,於底層數據庫無關。用戶需要維護主鍵值,在調用session.save()之前要指定主鍵值。注意:int auto_increment類型主鍵除外
<id name="id" column="id" type="string">
<generator class="assigned" />
</id>
2.Hilo
Hile使用高低位算法生成主鍵,高低位算法使用一個高位值和一個低位值,然后把算法得到的倆個值拼接起來作為數據庫中的唯一主鍵。Hile方式需要額外的數據庫表和字段提高位來源。默認情況下使用的表是hibernate_unique_key,默認的字段叫做next_hi。next_hi必須有一條記錄否則會出現錯誤。
特點:需要額外的數據庫表的支持,能保證同一個數據庫中主鍵的唯一性,但不能保證多個數據庫之間主鍵的唯一性。Hilo主鍵生成方式由Hibernate維護,所以Hilo方式與底層數據庫無關,但不應該手動修改hi/Io算法使用的表的值,否則會引起主鍵重復的異常。
3.increment
Increment方式對主鍵采取自動增長的方式生成新的主鍵值,但要求底層數據庫的支持Swquence。如Oracle,DB2等。需要在映射文件xxx.hbm.xml中添加Increment標識符的設置。
特點:由HIbernate本身維護,適用於所有的數據庫,不適合多進程並發更新數據庫,適合單一進程訪問數據庫。不能用於群集環境。
<id name="id" column="id">
<generator class="increment" />
</id>
4.Identity(常用)
Identity當時根據底層數據庫,來支持自動增長,不同的數據庫用不同的主鍵增長方式。
特點:於底層數據庫有關,適用於MySQl,DB2,MSSQL Server,采用數據庫生成的主鍵,用於為long,short,int類型生成唯一標識。使用SQL Server和MySQL的自增字段,這個方法不能放到Oracle中,Oracle不支持自增字段,要設定sequence(MySQL和SQL Server中很常用)Identity無需Hibernate和用戶的干涉,使用較為方便,但不便與在不同的數據庫之間移植程序。
Mysql:create table t_user(id int auto_increment primary key,name varchar(20));
SQL Server:create table t_user(id int identity(1,1) primary key,name varchar(20));
<id name="id" column="id" type="long"
<generator class="identity" />
</id>
5.Sequence(常用)、
Sequence需要底層數據庫支持Sequence方式,例如Oracle數據庫等
特點:需要底層數據庫的支持序列,支持序列的數據庫有DB2,PostgreSql,oracle,SAPDb等。在不同數據庫之間移植程序,特別從支持序列的數據庫移植到不支持序列的數據庫需要修改配置文件
Oracle:create sequence seq_name increment by 1 start with 1;需要主鍵時可以調用seq_name.nextval或者seq_name.cruval得到,數據庫會幫助我們維護這個sequence序列,保證每次得到的值唯一。如:
insert into table_name(id,name) values(seq_name.nextval,'lisi");
<id name="id" column="id" type="long">
<generator class="sequence">
<param name="sequence">seq_name</param>
</generator>
</id>
6.native(常用)
Native主鍵生成方式會根據不同的底層數據庫自動選擇Identity,Sequence,Hilo主鍵生成方式。
特點:根據不同的底層數據庫采用不同的主鍵生成方式。由於hibernate會根據底層數據庫采用不同的映射方式,因此便於程序移植,項目中如果用到多個數據庫時,可以使用這種方式。
<id name="id" colume="id">
<generator class="native" />
</id>
7.UUid
UUid使用128位UUID算法生成主鍵,能夠保證網絡環境下的主鍵唯一性,生成的主鍵占用比較多的存儲空間。
<id name="id" column="id">
<generator class="uuid.hex" />
</id>
有關主鍵生成策略的Annotation注解
@Id @GenerateValue @GenericGenerator