Hibernate ---- 主键生成策略

主键生成策略的整体概括。


注意:仔细区分不同主键生成策略的不同,如果主键的生成策略选择错误在执行表的操作的时候,会由于并发和锁的问题导致很多的错误,然后抛出异常。







sql语句的结果是:

扫描二维码关注公众号,回复: 1540794 查看本文章

由于他是需要hibernate管理的,所以每次都是先查后插入。




如果在程序中设置断点,那么当一个进程查询到了一个id结果,比如是1,但是没有提交的时候,另一个进程如果执行该操作也会先查询,那么查询的结果还是刚刚的id=1.当第二个进程提交的时候会出现id = 2 。那么第一个进程此时提交会出现问题。出现id主键冲突的报错。因此只能用于单进程。


与increment不同的是,该主键是由数据库产生的。



需要在person的类中添加一个属性,为uuid,并且生成相应的getter和setter。


在配置文件中也需要相应的修改需要两个位置。


执行结果:


相比于increment,uuid可以用于多线程。因为他是不会重复的32位的String、并且他也是由框架产生。




assign也是唯一的一个自然主键的生成方式,需要手动的设置主键。


主键生成机制如何实现的?

数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。

参考:http://zuoqiang.iteye.com/blog/755813

猜你喜欢

转载自blog.csdn.net/qq_36098284/article/details/80068381