
[英]Spring boot - Auto-increment problem after data insert through SQL
[英]Has Spring-boot changed the way auto-increment of ids works through @GeneratedValue?
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
,汽车的 id 为1 ,air 的值为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改变了什么,解释了这个场景?
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
无法按预期工作的原因。
你可以使用
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
使用 MySQL 自动增量。
如果您需要一个快速的、非面向未来的解决方案来防止此问题发生:
spring.jpa.hibernate.use-new-id-generator-mappings=false
,来自 Spring Boot 2 文档:
spring.jpa.hibernate.use-new-id-generator-mappings= # Whether to use Hibernate's newer IdentifierGenerator for AUTO, TABLE and SEQUENCE.
这将阻止使用新的生成器并保留 Spring boot 1.xx 中包含的旧功能
请注意,这可能不是最佳解决方案,但在短期内非常有帮助
正如安德鲁在评论中指出的那样,如果您不希望在其他表中创建值时增加 id,您可以像这样指定您的 ID:
@Id
@GeneratedValue(
strategy= GenerationType.AUTO,
generator="native"
)
@GenericGenerator(
name = "native",
strategy = "native"
)
private Long id;
这样做将使每个表都有其唯一的 id,以 1,2,3 ... 开头,依此类推。
默认情况下,spring-boot 使用 auto 并根据保存对象的顺序增加值。
要根据每个对象提供唯一 id,请使用以下命令
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.