小编典典

Hibernate oracle序列产生较大的缺口

hibernate

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

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 ;

Subject类是这样的:

@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个主题由excel的plsql脚本加载,并且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

这是浪费,不是期望的行为。

有谁知道为什么会这样,并且很热要解决它

谢谢


阅读 343

收藏
2020-06-20

共1个答案

小编典典

我认为问题出在以下事实:序列生成器实际上不是序列生成器,而是序列hilo生成器,默认分配大小为50。如文档所示:http ://docs.jboss.org/ hibernate/稳定/注释/参考/ en / html_single
/#entity-mapping-
identifier

这意味着,如果序列值是5000,则下一个生成的值将是5000*50=250000。将序列的缓存值添加到公式中,这也许可以解释您的巨大初始缺口。

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

2020-06-20