1、主键的分类:
1、1自然主键:主键的本身就是表中的一个字段,(实体中的一个具体的属性)。比如:创建一个人员表,使用身份证号码作为主键,这叫做自然主键。
1、2代理主键:主键的本身不是表中一个必须的字段。比如使用id,tid等作为主键,这叫做代理主键。
在实际开发中:尽量使用代理主键,因为:一旦自认主键参与到业务逻辑中,后期有可能要修改源代码,比如在输入采用身份证号码作为主键,一旦身份证号码在录入的过程中出现错误,则不可能通过sql语句进行更改(update * set id =id1 where id= id?),这种语句是错误的,因为数据库的主键不能被更改。
2、主键的生成策略:
》 increment :适用于short,int,long,类型的主键,由于采用的是hibernate的自动增长机制,所只能在单线程中使用,其内部实现过程是,首先发送一条语句,select max(id) form 表,然后将id+1作为插入数据的主键,如果在多线程中使用,有可能会出现重复的主键值,这是不允许的。
》 identity :适用于short,int,long类型的主键,适用的是数据库底层的自动增长机制。适用于有自动增长机制的数据库(mysql、mssql),注意oracle没有自动增长机制
》 sequence :适用于short,int,long,类型的主键,采用的是序列的方式(比如oracle数据库)
》 uuid :适用于字符串类型主键,使用hibernate中的随机方式生成字符串主键
》 native :本地策略,可以在indentity和sequence之间进行自定切换。
》 assigned :hibernate放弃主键的管理,需要通过手动编写程序或者用户自己设置。