Hibernate——主键生成策略

本文深入解析数据库设计中主键的概念,区分自然主键与代理主键,并探讨在实际开发中如何选择合适的主键生成策略,如increment、identity、sequence、UUID及native等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主键的分类

自然主键
  • 自然主键:主键的本身就是表中的一个字段(实体中的一个具体属性)
    • 创建一个人员表,人员都会有一个身份证号(唯一的不可重复的),使用了身份证号作为主键,这种主键称为自然主键。
代理主键
  • 代理主键:主键的本身不是表中必须的一个字段(不是实体中的某个具体的属性)
    • 创建一个人员表,没有使用人员的身份证号,用了一个与这个表不想关的字段ID,(PNO)这种主键称为代理主键。
  • 在实际开发中,尽量使用代理主键
    - 一旦自然主键参与到业务逻辑中,后期有可能修改源代码
    - 好的程序设计满足OCP原则,对程序的扩展是open 的,对修改源码是close的

主键的生成策略

在实际开发中一般不允许用户手动设置主键,一般将主键交给数据库,手动编写程序进行设置。在Hibernate中为了减少程序编写,提供了很多种的主键的生成策略。

  • increment

将使用hibernate中提供的自动增长机制,不使用数据库中的自动增长。适用short,int,long类型的主键。在单线程程序中使用。
- 首先发送一条语句:select max(id) from 表;然后让id + 1作为下一条记录的主键。

  • identity

identity :适用于short,int,long类型的主键,使用的是数据库底层的自动增长机制。适用于有自动增长机制数据库(MySQL,MSSQL),但是Oracle是没有自动增长。

  • sequence

适用short,int,long类型的主键,采用的是序列的方式。(Oracle支持序列)

  • UUID

适用于字符串类型主键。适用Hibernate中的随机方式生成字符串主键。

  • native

本地策略,可以在identity和sequence之间进行自动切换。

  • assigned

hibernate 放弃外键的管理,需要通过手动编写程序或者用户自己设置。

  • foreign

外部的,一对一的一种关联映射的情况下使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值