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 也作为主键。它们之间没有相关性,例如没有共享序列。
现在,使用 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 许可协议
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
不能按预期工作的原因。