oracle - hibernate oracle 序列产生大的间隙

标签 oracle hibernate sequence gaps-in-data

我正在使用 hibernate 3,oracle 10g。我有一张 table :主题。定义在这里

CREATE TABLE SUBJECT
    ( 
     SUBJECT_ID NUMBER (10), 
     FNAME VARCHAR2(30)  not null, 
     LNAME VARCHAR2(30)  not null, 
     EMAILADR VARCHAR2 (40),
     BIRTHDT  DATE       not null,
     constraint pk_sub primary key(subject_id) USING INDEX TABLESPACE data_index
    ) 
;

插入新主题时,使用sub_seq创建主题id,定义在这里
create sequence sub_seq
       MINVALUE 1 
       MAXVALUE 999999999999999999999999999 
       START WITH 1
       INCREMENT BY 1 
       CACHE 100 
       NOCYCLE ;

主题类是这样的:
@Entity
@Table(name="ktbs.syn_subject")
public class Subject {

    @Id 
    @Column(name="subject_id")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SUB_SEQ")
    @SequenceGenerator(name="SUB_SEQ", sequenceName = "SUB_SEQ")
    private long subjectId;
    private String fname;
    private String lname;
    private String emailadr;
    private Date birthdt;
}

在主题表中,数据库中有 4555 个主题由 plsql 脚本从 excel 加载,并且 sub_sequence 工作正常。主题 ID 范围为 1--4555。

然而,当我使用 hibernate 从我的应用程序中添加一个主题时,
序列号跳到了255050。经过几天的运行,hibernate生成的主题id是这样的
270079
270078
270077
270076
270075
270074
270073
270072
270071
270070
270069
270068
270067
270066
270065
270064
270063
270062
270061
270060
270059
270058
270057
270056
270055
270054
270053
270052
270051
270050
265057
265056
265055
265054
265053
265052
265051
265050
260059
260058
260057
260056
260055
260054
260053
260052
260051
260050
255067
255066
255065
255064
255063
255062
255061
255060
255059
255058
255057
255056
255055
255054
255053
255052
255051
255050
4555
4554
4553
.
.
.
.
1

有几个大的差距:4555到255051、255067到260051、265057到270051

这是一种浪费,而不是一种理想的行为。

有谁知道为什么会发生这种情况并且热修复它

谢谢

最佳答案

我认为问题在于序列生成器并不是真正的序列生成器,而是序列 hilo 生成器,默认分配大小为 50。如文档所示:http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-identifier

这意味着如果序列值为 5000,则下一个生成的值将是 5000 * 50 = 250000。将序列的缓存值添加到等式中,它可能解释了你巨大的初始差距。

检查序列的值。它应该小于最后生成的标识符。注意不要将序列重新初始化为最后生成的值 + 1,因为生成的值会呈指数增长(我们遇到了这个问题,并且由于溢出而有负整数 id)

关于oracle - hibernate oracle 序列产生大的间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5346147/

相关文章:

sql - 左联接中的歧义(仅适用于Oracle?)

c# - EF Core 5 HasDefaultValue 问题,当值设置为 .Net 类型默认值时,ef 推送默认值

java - h2 留下锁定文件,即使只创建一个连接并立即断开连接

Hibernate - 更新与级联类型 all-delete-orphan 映射的集合的正确方法

java - 如何使用 hibernate 逆向工程工具生成带有 ejb3 注释的 pojo?

swift - 从收藏 View 自动播放下一个音频文件

f# - 如何在 F# 中打印出整个斐波那契数列直到用户输入的值?

oracle - 我应该在Oracle中索引主键列吗

sql - 从联合查询的结果中选择 Oracle

excel - 分组直到改变顺序