gpt4 book ai didi

oracle - JBoss EAP 6.x 在主键上带有 Hibernate Oracle 序列重复值

转载 作者:行者123 更新时间:2023-12-04 10:18:53 29 4
gpt4 key购买 nike

我已经使用纯 JPA 注释定义了许多 Hibernate 实体。这些在我的数据库上使用预定义的 Oracle 序列来自动生成主键值。

@Id
@SequenceGenerator(name = "USERS_ID_GENERATOR", sequenceName = "MY_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_ID_GENERATOR")
@Column(name = "U_ID", updatable = false, unique = true, nullable = false, precision = 19)
private Long id;

当它被部署到 JBoss EAP 6.1 时,最初一切都运行良好,但是在短时间内 Hibernate 开始在插入时生成重复的键(ORA-00001 错误)。

我不在乎 id 排序或间隙,但不能容忍重复的键......这里发生了什么?

最佳答案

这没有得到很好的记录,这里和其他站点上的许多解决方案都与旧版本的 hibernate 相关,其中 HiLo sequenceGenerator 是默认设置。但经过调查我发现根本原因是 JBoss EAP 6 集

hibernate.id.new_generator_mappings=true 

默认情况下,它使用 org.org.hibernate.id.enhanced.SequenceStyleGenerator 而不是旧版本。

Hibernate SequenceStyleGenerator 默认增量为 1(检查代码!),但是 JPA 将此生成器中的增量值覆盖为 50。这意味着生成器查看序列 nextval 并保留 50 个 id 的缓存以供使用,从 nextval 开始 - 49. 当这些用完时,生成器从 oracle 读取下一个序列,并重复该过程。因此,一旦第一个系列的 id 用完,我们就会开始看到重复的键。

所以决议是:

1) 定义您的 Oracle 序列,增量值为 50 以匹配 JPA 默认值
CREATE SEQUENCE MY_SEQ
START WITH 50
MAXVALUE 9999999999999999999
INCREMENT BY 50
NOCYCLE;

或者

2) 将 allocationSize=1 添加到 @SequenceGenerator 注释中 - 这会强制 SequenceGenerator 返回从它需要的每个 ID 的 oracle 序列中读取下一个值(具有潜在的性能影响)
 @SequenceGenerator(name = "USERS_ID_GENERATOR", sequenceName = "MY_SEQ", allocationSize = 1)

, 或者

3) 通过其他值定义 Oracle 序列 INCREMENT,并确保 allocationSize 匹配。

回答了我自己的问题,希望能帮助解决这个问题的其他人。

关于oracle - JBoss EAP 6.x 在主键上带有 Hibernate Oracle 序列重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17825737/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com