java - 了解 JPA 序列生成器

标签 java spring-boot hibernate spring-data-jpa

我正在使用 spring data JPA 的序列生成器将主键分配给实体。

模型包含:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_post")
@SequenceGenerator(name = "seq_post", allocationSize = 5)
private Long id;

对应的序列定义(针对SQL Server DB):

CREATE SEQUENCE dbo.seq_post START WITH 1 INCREMENT BY 5;

因为我想从 100 而不是 1 开始,所以我将 sql 脚本更新为

CREATE SEQUENCE dbo.seq_post START WITH 100 INCREMENT BY 5;

然后我遇到了提到的问题here .我通过那里提到的解决方案修复了它。

这让我想知道,当我希望数据库序列从 1 开始时,为什么这个问题没有发生?基于提到的答案here我希望 id 不会从 1 开始,但这并没有发生。为什么会这样?

最佳答案

首先检查您是否设置了属性 hibernate.id.new_generator_mappingstrue作为recomended

调整是对的 allocationSize序列为 INCREMENT BY .

如果你想开始 ID具有特定值的它似乎遵守以下规则:

  • 一个开始,将序列设置为START WITH 1 (这个好像是个异常(exception))

  • 开始于 X > 1设置顺序 START WITH X + 50 (实际上 X < 1 也是如此)

例如从 5000 开始默认 allocationSize50定义序列如下

create sequence sub_seq
       START WITH 5050
       INCREMENT BY 50
       NOCACHE;

请注意,我使用的是 NOCACHE选项,因为我假设 Hibernate 是这个序列的唯一用户,所以缓存 并不是真正有意义的(实际上替换 为分配大小。

你也放松在 session 之间大约。 allocationSize 的 1/2|的 ID s 并且您不想增加缓存的额外丢失 ID

关于java - 了解 JPA 序列生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67649400/

相关文章:

oracle - 尝试使用 Hibernate 映射日期字段时缺少包含下划线的列

java - 如何使用 ReST Web 服务的 spring 验证来验证输入模型并返回适当的错误消息

java - 为什么 spring-boot 和 postgres 连接在一定时间后中断?

java - Spring Data JPA - 是否可以对计算属性进行排序?

java - Spring Boot maven 插件找不到主类,无法执行 java

java - 是否可以标记 springboot 测试,以便它们仅在某些配置文件处于 Activity 状态时运行

json - Spring boot Embedded Tomcat "application/json"post请求限制为10KB

java - Java中存储KeyStore : empty file and unable to reload

java - struts 2的execute方法之后调用的validate方法

java - MVC 和带有 Set<> 的对象