一尘不染

Spring-boot是否通过@GeneratedValue更改了ID自动递增的工作方式?

spring-boot

Spring-Boot 2.0.0 似乎已经修改了自动配置 Hibernate 的方式。

让我们假设两个简单且独立的JPA实体:

@Entity
class Car {
   @Id
   @GeneratedValue
   private long id;
   //....
}

@Entity
class Airplane {
   @Id
   @GeneratedValue
   private long id;
   //....
}

在此之前,使用Spring-Boot的 1.5.10 ,我是能够产生自动递增的单独序列,这意味着我可以得到一个Car带有 1
作为主键和Airplane1 作为主键也。它们之间没有相关性,例如没有共享序列。

现在,在 2.0.0版本中 ,当我依次创建一个第一个Car然后一个第一个时Airplane,汽车的ID为 1 ,飞机的ID为
2

看来他必须处理GeneratedType.AUTO,即@GeneratedValue注释源中指定的“默认使用” 。
但是,我的推理似乎在这里停止了,因为 1.5.10*GeneratedType.AUTO也将其设置为默认值。 *

一个满足我期望的简单解决方法是指定IDENTITY生成的策略类型,如下所示:

@Entity
class Car {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long id;
   //....
}

@Entity
class Airplane {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private long id;
   //....
}

我不知道这种行为的解释。

Spring-boot 2.0.0 发生了什么变化,从而解释了这种情况?


阅读 336

收藏
2020-05-30

共1个答案

一尘不染

Spring Boot 2.0使用Hibernate 5.2(https://github.com/spring-projects/spring-
boot/wiki/Spring-Boot-2.0-Release-Notes)。从5.2开始,
Hibernate更改了其GeneratedType.AUTO策略。任何本身不支持序列的数据库(例如MySQL),它们都使用TABLE生成器代替IDENTITY。(https://hibernate.atlassian.net/browse/HHH-11014

这就是为什么GeneratedType.AUTO无法按预期工作的原因。

2020-05-30