Hibernate ---- 主键生成策略
主键生成策略的整体概括。
注意:仔细区分不同主键生成策略的不同,如果主键的生成策略选择错误在执行表的操作的时候,会由于并发和锁的问题导致很多的错误,然后抛出异常。
sql语句的结果是:
由于他是需要hibernate管理的,所以每次都是先查后插入。
如果在程序中设置断点,那么当一个进程查询到了一个id结果,比如是1,但是没有提交的时候,另一个进程如果执行该操作也会先查询,那么查询的结果还是刚刚的id=1.当第二个进程提交的时候会出现id = 2 。那么第一个进程此时提交会出现问题。出现id主键冲突的报错。因此只能用于单进程。
与increment不同的是,该主键是由数据库产生的。
需要在person的类中添加一个属性,为uuid,并且生成相应的getter和setter。
在配置文件中也需要相应的修改需要两个位置。
执行结果:
相比于increment,uuid可以用于多线程。因为他是不会重复的32位的String、并且他也是由框架产生。
assign也是唯一的一个自然主键的生成方式,需要手动的设置主键。
主键生成机制如何实现的?
数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。