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

Flo*_*est 14 spring hibernate jpa spring-data-jpa 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;
   //....
}
Run Code Online (Sandbox Code Playgroud)

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

现在,使用2.0.0,当我顺序创建第一个Car然后第一个时Airplane,汽车获得1作为id并且飞机获得2.

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

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

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

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

我无法弄清楚这种行为的解释.

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

小智 13

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不能按预期工作的原因.

  • 嗨,敏,谢谢... https://vladmihalcea.com/why-should-not-use-the-auto-jpa-generationtype-with-mysql-and-hibernate/ (2认同)

moj*_*egh 7

您可以使用

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
Run Code Online (Sandbox Code Playgroud)

使用MySQL自动增量。