我正在使用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
这是浪费,不是期望的行为。
有谁知道为什么会这样,并且很热要解决它
谢谢
我认为问题出在以下事实:序列生成器实际上不是序列生成器,而是序列hilo生成器,默认分配大小为50。如文档所示:http ://docs.jboss.org/ hibernate/稳定/注释/参考/ en / html_single /#entity-mapping- identifier
这意味着,如果序列值是5000,则下一个生成的值将是5000*50=250000。将序列的缓存值添加到公式中,这也许可以解释您的巨大初始缺口。
检查序列的值。它应该小于最后生成的标识符。注意不要将序列重新初始化为最后一个生成的值+ 1,因为生成的值将呈指数增长(我们遇到了这个问题,并且由于溢出而具有负整数ID)