【SSH】SSH之Hibernate框架:Hibernate的主键生成策略

梦想与她 提交于 2020-02-09 03:15:39

主键:

自然主键:用表中一个有实际意义的字段(对应持久化类中的一个有实际意义的属性)来作为主键,例如创建的一个人员表,用人员的身份证号作为主键。
代理主键:不是表中一个有实际意义的字段,它的存在仅仅是用来作为每条记录的唯一标识。在设置主键的时候通常用代理主键,因为自然逐渐是一个有实际意义的字段,有可能会更改,而代理主键没有实际意义,不存在后续更改的情况。

Hibernate的代理主键生成策略:

在实际开发中一般不允许用户设置主键,而是由程序自动生成,Hibernate提供的的主要的主键生成策略有以下几种:

  • increment:适用short、int、long类型的主键,实现原理是首先发送一个sql语句查询表中最大的id,然后将该id+1作为新纪录的id。从原理可以看到该方法存在线程安全问题,因为如果是多个线程同时操作时,新的记录还没插入表中,新的线程就查询到了还没增加的id,此时该线程也会生成一个与上一个线程相同的id,就会发生id冲突。因此,该方法应在单线程中使用。
  • identity:适用short、int、long类型的主键,使用的是数据库底层的自动增长机制,因此不会出现线程安全问题。但是应该注意的是,DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 等数据库有自动增长机制,而Oracle没有。
  • sequence:适用short、int、long类型的主键,DB2,PostgreSQL,Oracle,SAP DB,McKoi 等数据库使用序列(sequence), 而MySQL不支持序列,不能使用sequence。
  • uuid:适用String类型的主键,使用该主键生成策略后,Hibernate会自动生成随机字符串作为主键。
  • native:本地策略,本地用的MySQL数据库则使用identity策略,本地用的是Oracle数据库则使用sequence策略。
  • assigned:如果使用该策略,则hibernate会放弃对主键的生成管理,让应用程序在调用 save() 之前为对象分配一个标识符。这是 <generator> 元素没有指定时的 默认生成策略。此时需要通过编写程序生成或用户自己来设置。
  • foreign:使用另外一个相关联的对象的标识符。它通常和 <one-to-one> 联合起来使用。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!