主键的生成策略
在第一篇的文章中,配置映射文件的时候接触到了主键的生成策略,接下来对这几个策略进行一下说明:
<class name="com.bestbigkk.domain.Person" table="tb_person">
<!--指示该实体类中哪一属性与表的主键对应,每建立一个映射关系都必须指定!-->
<id name="id" column="id">
<!--设置这个实体类映射的表的主键生成策略-->
<generator class="native"></generator>
</id>
......
</class>
主键生成策略具有以下的几个可选值:
- increment
用于主键类型为long, short, int 类型的主键,由Hibernate以递增的方式生成主键,增量为1, 只有在没有其他进程对同一张表进行操作的时候才可以使用,不适用于集群环境。适用于代理主键。 - identity
使用底层数据库本身提供的主键生成标识符,使用该值需要数据库支持自动增长,所以在Oracle数据库是无法使用该值的,并且要求把数据库中表的主键设置为自动增长的,适用于代理主键。 - sequence
根据底层数据库的序列生成标识符,使用的话数据库需要支持序列,MySql不支持该值。 - native
常用的一个选项,根据底层数据库产生标识符的特点来自动选择使用identity,sequence,hiol三种生成器的一种,适应于代理主键。 - uuid
Hibernate采用128位的UUID算法来生成标识符,该标识符是唯一的,但是因为相比于整数类型的主键它占用了更多的空间,所以并不常用,适用于代理主键, - assigned
由Java程序指定标识符,适用于自然主键
如果没有指定generator的值,则默认会使用assigned策略
自然主键与代理主键的简述
1.自然主键 : 就是该主键存储的信息是有用的, 比如一个人的工号,可以作为主键存在,并且本条信息是有含义的!
2.代理主键:纯粹是用于区分不同行的信息的,不保存有用的信息,仅仅只是一个主键