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