Spring JPA 创建 MySQL 数据表的自增 ID

更新日期: 2020-12-18 阅读次数: 6257 字数: 375 分类: spring

首先看一下大部分教程,和 Spring JPA 入门文档上的写法:

代码示例

@Data
@Entity
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    private String title;
}

在 MySQL 中使用 show create table 看一下自动生成的表结构:

CREATE TABLE `article` (
  `id` bigint NOT NULL,
  `title` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

自增 ID 是如何实现的

看了这个表结构,立马会产生疑问,自增 ID 设置哪里去了?

如果没有 AUTO_INCREMENT 设置,Spring JPA 是如何实现自增 ID 的。

在 MySQL 中使用 show tables 命令,会发现多了一个奇怪的表 hibernate_sequence。

看一下表结构:

CREATE TABLE `hibernate_sequence` (
  `next_val` bigint DEFAULT NULL
) ENGINE=InnoDB

查了一下文档,这种做法相当于实现了一个全局的 ID 变量,每次需要生成 ID 的时候,参考一下这个表里的 next_val 字段。如果没有区分表,那岂不是所有表都在共用这个机制,每个表的 ID 都变成了不连续的?确实如何。

所以,我还是倾向于使用 MySQL 的 AUTO_INCREMENT 机制。

解决方法

修改成:

@GeneratedValue(strategy = GenerationType.IDENTITY)

将原表 drop 后,重新生成数据表,会看到 id 字段变成了自增:

`id` bigint NOT NULL AUTO_INCREMENT,

参考

GeneratedValue 注解的可选项说明: https://www.objectdb.com/java/jpa/entity/generated

非常有趣,发现 GeneratedValue 不但可以在 ID 上使用,其实其他字段也可以使用这个机制。

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式