首先看一下大部分教程,和 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 聊聊, 查看更多联系方式