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

文章目录

    首先看一下大部分教程,和 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式