hibernate中的主键生成方式是在***.hbm.xml文件中指定的,例如:
< generator class="native" />
这里面的generator元素就是指定主键生成方式的配置。
class属性的取值有increment、hilo、identity、sequence、native、assigned、select、seqhilo、foreign、guid等等
1)increment
①由Hibernate以递增的方式为代理主键赋值
②Hibernate会先读取数据库表中主键的最大值,插入记录以最大值+1的形式为主键
③不依赖底层数据库系统,所以适用于各类数据库系统
④在多线程下很容易发生错误,错误的原因是:各个线程获取数据库表中的主键的最大值相同,都以最大值+1的形式作为主键插入到数据库表中,那么会违反数据库表主键唯一性约束,就会报错。
⑤OID必须为long、int或short类型,如果为byte则会抛出异常。
2)hilo
①hibernate以high/low算法生成主键
3)identity
①由具体数据库生成主键
②要求数据库将主键定义为自动增长类型
③支持自增主键的数据库:MySQL、DB2、SQL server 、sybase等,oracle不支持
④OID必须为long、int或short类型,如果为byte则会抛出异常。
4)sequence
①利用底层数据库提供的序列生成标识符
②要求底层支持序列:DB2、Oracle
③OID必须为long、int或short类型,如果为byte则会抛出异常。
配置如下:
stu_seq
5)native
①依据底层数据库对自动生成标识符的支持能力,来选择使用identity、sequence或者hilo
②native标识符生成器能够根据底层数据库系统的类型,自动选择合适的方式生成主键,所以适合跨数据库平台开发
③OID必须为long、int或short类型,如果为byte则会抛出异常。
6)assigned
hibernate和数据库系统都不负责生成主键的值,完全由程序员自己生成。