increment标识符生成器
标识符生成器由hibernate以递增的方式为代理主键赋值
<id name="id" type="long" column="ID">
<generator class="increment"></generator>
</id>
适用范围:
- 由于increment生成标识符的机制不依赖于底层的数据库系统(由hibernate生成),因此它适用于所有的数据库系统
- 只适用于单个hibernate应用访问同一数据库的场合,在集群环境下不推荐使用它
- OID必须为long,int或者short类型,如果把OID定义为byte类型,在运行时会抛出异常。
identity标识符生成器
它是由底层数据库来负责生成标识符(记录的主键),它要求底层数据库把主键定义为自动增长的字段类型,例如:在mysql中应该把主键定义为auto increment类型。
<id name="id" type="long" column="ID">
<generator class="identity"></generator>
</id>
适用范围:
- 由于identity生成标识符的机制依赖于底层的数据库系统(由hibernate生成),因此要求底层数据库系统必须支持自动增长的字段类型。支持自动增长字段类型的数据库包括mysql等。
- 只适用于单个hibernate应用访问同一数据库的场合,在集群环境下不推荐使用它
- OID必须为long,int或者short类型,如果把OID定义为byte类型,在运行时会抛出异常。
sequence标识符生成器
它是由底层数据库提供的序列来生成标识符
<id name="id" column="ID" type="long">
<generator class="sequence">
<param name="sequence"></param>
</generator>
</id>
适用范围:
- 要求底层数据库系统必须支持序列
- OID必须为long,int或者short类型,如果把OID定义为byte类型,在运行时会抛出异常。
hilo标识符生成器
由hibernate按照一种high/low算法来生成标识符,他从数据库的特定表的特定字段中获取high值
使用方法:
hilo算法即是id = hi*(max_low+1) + low;low值在0-max_low-1中进行循环,low值每循环一圈,hi值就增加1
适用范围:
- hilo不依赖于底层的数据库系统,因此适用于所有的数据库系统
- OID必须为long,int或者short类型,如果把OID定义为byte类型,在运行时会抛出异常。
native标识符生成器
根据底层数据库对自动生成标识符的支持能力,来自动选择使用identify,sequence,还有hilo标识符生成器。native能自动判断底层数据库系统提供的生成标识符的机制。选择identify还是sequence还是hilo标识符生成器。
使用方法:
<id name="id" type="long" column="ID">
<generator class="native"></generator>
</id>
适用范围:
- 由于native 能自动根据底层数据库系统的类型,来自动选择适合的标识符生成器。因此很适合跨数据库平台的开发,即同一个hibernate应用需要连接多种数据库系统的场合。
- OID必须为long,int或者short类型,如果把OID定义为byte类型,在运行时会抛出异常。
主意 :
当Oracle数据库报hibernate_sequence错误的时候,可以创建hibernate-sequence这么一个序列,这样就可以避免报错。