我已将hibernate配置为使用oracle序列。使用cache = 20,increment = 1创建序列。
一切正常,hibernate持久实体。id值很奇怪:50,51 .... 76,201,202 … 209,1008,1009,5129,5130 ....
如果我要求序列值(从双重选择hibernate_sequence.nextval),我会得到像2,3,4 …的值。
如果我打开hibernate sql debug,则有时间不停地调用“从double中选择hibernate_sequence.nextval”,但是由hibernate分配给ID的编号不会按顺序传递!
@Id @Column(name = "ID", insertable = false, updatable = false) @SequenceGenerator(name = "SequenceIdGenerator", sequenceName = "HIBERNATE_SEQUENCE") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceIdGenerator") private Long id;
这是因为SequenceGenerator实际上不是序列生成器。这是一个序列高音发生器。这意味着,第一次调用它时,它将从序列中获取下一个值(例如6),然后将该值乘以50并得到结果(300)。下次调用它时,它返回301(不进行序列操作),依此类推,直到达到349。然后它向序列请求下一个值,并获得7,将其再次乘以50,得到350。算法描述可能相距一个,但您明白了。
如果停止并启动您的应用程序,则将存在空白。但是它比纯序列生成器更有效,因为它每50代只进行一次数据库调用。
参见http://docs.jboss.org/hibernate/core/3.6/reference/zh- CN/html_single/#mapping-declaration-id-enhanced- optimizers和http://docs.jboss.org/hibernate/core/有关详细信息,请参见3.6 / reference / zh-CN / html_single /#mapping-declaration-id- generator。