Spring-boot 是否通过@GeneratedValue 改变了 ids 自动增量的工作方式?

新手上路,请多包涵

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 ,我能够生成单独的自动增量序列,这意味着我可以获得 Car1 作为主键和 Airplane1 也作为主键。它们之间没有相关性,例如没有共享序列。

现在,使用 2.0.0 ,当我依次创建第一个 Car 然后第一个 Airplane 时,汽车获得 1 作为 id 和飞机获得 2

看来他必须处理 GeneratedType.AUTO ,即 @GeneratedValue 注释源中指定的“默认使用”。

但是,我的推理似乎停在这里,因为 GeneratedType.AUTO 也被设置为默认值 1.5.10

满足我期望的一个简单解决方法是指定 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 发生了什么变化,解释了这种情况?

原文由 Florian Laforest 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 465
1 个回答

Spring Boot 2.0 使用 Hibernate 5.2 ( https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes )。

Hibernate 从 5.2 开始改变了它的 GeneratedType.AUTO 策略。任何本身不支持序列的数据库(例如 MySQL),它们都使用 TABLE 生成器而不是 IDENTITY。 ( https://hibernate.atlassian.net/browse/HHH-11014

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

原文由 Min Hyoung Hong 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题