🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## OID(标识属性)的作用 可以让hibernate区分多个对象.JVM是 通过内存地址来区分两个对象是否是同一个.数据库是通过主键来区分两条记录是否为同一个.不同的技术对于对象是否 为同一个的判断凭据不同. 结论是:hibernate必须有一个OID属性,而且这个OID属性还不能相同. 如何保证OID不同? 使用的就是hibernate提供的一门技术:主键生成策略. ## 自然主键 创建表的时候,使用的是实体中的自身属性作为表的主键. 例如创建一张人员表,可以用自身的身份证号作为主键. ## 代理主键 创建表的时候,使用的不是实体中的自身的属性作为主键,创建一个不相关的一个字段作为主键.(正常开发都是使用代理主键) ## 主键生成策略 主键不应该由用户自己维护,应该统一管理,那么hibernate就提供了主键统一管理的方式:主键生成策略. * increment : 自动增长,是hibernate中提供一种自动增长方式,不是数据库中的自动增长(适用于short,int,long类型的主键) .首先使用select max(cust_id) from cst_customer.将这个最大值+1作为下一条记录的主键.对于并发访问不适用. * identity:自动增长,适用于short,int,long类型的主键,使用的是数据库自动增长机制.不是所有数据库都支持自动增长,比如Oracle没有自动增长. * sequence:序列,适用于short,int,long类型的主键,使用序列方式完成主键的生成.必须是支持序列的方式的数据库.Oracle的自动增长. * native:本地策略,根据底层的数据库不同,自动选择 使用identity还是sequence. * uuid:随机字符串,适用于字符串类型的主键. * assigned:hibernate不维护主键,开发人员需要手动设置主键. 总结:以后如果针对是数值型,选择用native.如果是varchar类型,可以选择用UUID. 但是也可以不用hibernate维护,自己 在程序中手动设定唯一非空(assigned).