1.increment
可以生成long、int、short类型的主键,由hibernate在内存中生成主键,每次增量为1,不依赖于底层数据库,但是因为是由hibernate生成的,所以只能有一个hibernate进程访问数据库,否则就会产生主键冲突,所以不能在集群的情况下使用;
2.identity
可以生成long、int、short类型的主键,是由数据库自己生成的,这个主键必须设置为自增长,因此使用identity的前提是数据库支持自增长,oracle是不支持的;
3.sequence
采用数据库提供的sequence机制生成主键,需要数据库支持sequence,mysql是不支持的;
4.hilo
使用一个高低位算法生成的long、short、int类型的标识符,跨数据库;
5.native
根据底层数据库的能力选择identity、sequence或hilo中的一个,当项目中用到多个数据库时可以使用这种方式,使用时需要设置表的自增字段或建立序列,建立表等;
6.uuid
hibernate采用128位的uuid算法来生成主键,能够在网络环境中生成唯一的一个32位16进制数字的字符串,跨数据库,不用访问数据库就能生成主键,所以效率高且能保证唯一性,移植非常方便;
7.assigned
与hibernate和底层数据库均无关,人为控制主键的生成,应尽量避免;
8.foreign
使用另外一个相关联的对象的标识符,大多用在一对一关系中;
代理主键:与业务无关且能唯一标识数据库中记录,一般由数据库自动生成,除assigned之外的所有主键生成策略;
自然主键:与业务相关,由用户指定,且能唯一标识数据库中的任意一条记录,如assigned;