Hibernate主键的生成策略
<class name="Customers" table="customers">
<id name="id" column="id">
<!-- 主键的生成策略 -->
<generator class="native"></generator>
</id>
<class>
<id>标签是为每一个实例包含唯一的标识,唯一的标识要有主键生成器,可选的 <generator>子元素是一个java类的名字,用来为该持久化类的实例生成唯一的标识。
所有的主键生成器都实现org.hibernate.id.TableLoGenerator接口
下面主要讨论一下hibernate内置生成器的快捷名字和使用
分为下面几种:
increment,identity,sequence,
Hilo, seqhilo, uuid, guid, native, assigned, select, foreign, sequence-identity
分别来介绍一下这几个取值的作用和意义:
increment
用于为long和short或者int类型生成唯一标识符,只有在没有其他进程往同一张表插入数据时才能使用,在集体下不要使用
ientity
对DB2,MySql,MS SQL Server,Sybase和HypersonicSQL的内置标识字段提供支持,返回的标识符是long,short或者int类型的。
sequence
在DB2.,PostgreSQL,SAP DB,McKoi中使用序列,而在Interbase中使用生成器。返回的标识符是long,short或者int类型的。
hilo
使用一个高/低位算法高效的生long,short,获取int类型的标识符,给定义二表和字段作为高位置的来源。高低位算法生成的标识符只在一个特定的数据库中是唯一的。
seqhilo
使用一个高/低位算法来高效的生成long,short获取int类型的标识符,给定一个数据库序列的名字
uuid
用一个128-bit的UUID算法生成字符串类型的标识符,这是在一个网络中是唯一的,UUID被编码为一个32位16进制数字的字符串
guid
在MS SQL Server和MySql中使用数据库生成GUID字符串
native
根据底层数据库的能力选择identity,sequence获取hilo中的一个
assigned
让应用程序在save()之前为对象分配一个标识符,这是<geneerator>元素没有指定时的默认的生成策略
select
通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键
foreign
通过另外一个相关联的对象的标识符,通常和<ont-to-one>联合起来使用
sequence-identity
一种特别的序列生成的策略,使得数据库序列来生成实际值,但将它和JDBC3的getGeneratedKeys结合在一起,使得在插入语句执行的的时候就返回生成的值,目前为止只有面向对象JDK1.4的Oracle 10g驱动支持这一策略,注意,因为Oracle驱动程序的一个bug,这些插入语句的注释被关闭了。
可以总结一下,对Oracle数据进行使用的有:
1) assigned
2) hilo
3) seqhilo
4) increment
5) identity
6) sequence
7) native方式。
8) uuid.hex 9) uuid.string
10) foreign