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 作为主键和Airplane带 1 作为主键也。它们之间没有相关性,例如没有共享序列。
Car
Airplane
现在,在 2.0.0版本中 ,当我依次创建一个第一个Car然后一个第一个时Airplane,汽车的ID为 1 ,飞机的ID为 2 。
看来他必须处理GeneratedType.AUTO,即@GeneratedValue注释源中指定的“默认使用” 。 但是,我的推理似乎在这里停止了,因为 1.5.10*GeneratedType.AUTO也将其设置为默认值。 *
GeneratedType.AUTO
@GeneratedValue
一个满足我期望的简单解决方法是指定IDENTITY生成的策略类型,如下所示:
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 发生了什么变化,从而解释了这种情况?
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无法按预期工作的原因。