主键的分类
自然主键
- 自然主键:主键的本身就是表中的一个字段(实体中的一个具体属性)
- 创建一个人员表,人员都会有一个身份证号(唯一的不可重复的),使用了身份证号作为主键,这种主键称为自然主键。
代理主键
- 代理主键:主键的本身不是表中必须的一个字段(不是实体中的某个具体的属性)
- 创建一个人员表,没有使用人员的身份证号,用了一个与这个表不想关的字段ID,(PNO)这种主键称为代理主键。
- 在实际开发中,尽量使用代理主键
- 一旦自然主键参与到业务逻辑中,后期有可能修改源代码
- 好的程序设计满足OCP原则,对程序的扩展是open 的,对修改源码是close的
主键的生成策略
在实际开发中一般不允许用户手动设置主键,一般将主键交给数据库,手动编写程序进行设置。在Hibernate中为了减少程序编写,提供了很多种的主键的生成策略。
- increment
将使用hibernate中提供的自动增长机制,不使用数据库中的自动增长。适用short,int,long类型的主键。在单线程程序中使用。
- 首先发送一条语句:select max(id) from 表;然后让id + 1作为下一条记录的主键。
- identity
identity :适用于short,int,long类型的主键,使用的是数据库底层的自动增长机制。适用于有自动增长机制数据库(MySQL,MSSQL),但是Oracle是没有自动增长。
- sequence
适用short,int,long类型的主键,采用的是序列的方式。(Oracle支持序列)
- UUID
适用于字符串类型主键。适用Hibernate中的随机方式生成字符串主键。
- native
本地策略,可以在identity和sequence之间进行自动切换。
- assigned
hibernate 放弃外键的管理,需要通过手动编写程序或者用户自己设置。
- foreign
外部的,一对一的一种关联映射的情况下使用。