oracle – Hibernate序列生成器不一致
我有一张促销ID注明为的表 @SequenceGenerator(name="GEN_PROMID",sequenceName="SEQ_PROMOTIONID",allocationSize=1) @Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="GEN_PROMID") @Column(name="PROMOTIONID") private Long promotionid; 但即使将allocationSize指定为1,hibernate也会不一致地增加数字.以下是DB中promotionid的最新降序值 1440 1420 1407 1406 1405 1404 1403 1402 1401 1400 1380 1360 1342 1341 1340 1320 1305 我在某处读到,即使定义了@SequenceGenerator,Hibernate也可能会使用hilo seq_hilo algotihm和org.hibernate.id.SequenceHiLoGenerator生成器.另请阅读以下链接,我们可以使用@GenericGenerator来解决链接中的此问题 > http://lists.jboss.org/pipermail/hibernate-issues/2009-March/014663.html 有人可以在这种情况下抛出详细信息吗? @GenericGenerator语法看起来不明显.应该使用@SequenceGenerator.有时@SequenceGenerator可以正常工作并生成正确的主键. PS.我正在使用Hibernate 3.5并使用Oracle 11g DB 编辑 序列码 – CREATE SEQUENCE SEQ_PROMOTIONID INCREMENT BY 1 START WITH 100; 编辑2 更多分析表明,至少可以“总”插入一个可被20整除的值.由于Oracle的序列默认缓存为20,因此看起来正常的hibernate增量与缓存值之间存在一些冲突.还观察到当插入在它们之间有时间间隔时,它用于进入下一个可被20整除的值,否则正确地增加到1 1440 12-NOV-14 09.33.09.686000000 AM 1420 07-NOV-14 07.21.41.238000000 AM 1407 03-NOV-14 11.40.41.508000000 AM 1406 03-NOV-14 11.31.37.341000000 AM 1405 03-NOV-14 04.57.53.356000000 AM 1404 03-NOV-14 04.56.39.074000000 AM 1403 03-NOV-14 04.55.17.741000000 AM 1402 03-NOV-14 04.30.59.980000000 AM 1401 03-NOV-14 04.27.14.016000000 AM 1400 03-NOV-14 04.19.23.736000000 AM 1380 27-OCT-14 11.06.33.360000000 AM 1360 17-OCT-14 11.59.15.738000000 AM 1342 15-OCT-14 01.57.50.253000000 PM 1341 15-OCT-14 01.55.39.173000000 PM 1340 14-OCT-14 07.07.14.283000000 AM 1320 10-OCT-14 10.41.04.766000000 AM 1305 07-OCT-14 11.08.10.388000000 AM 1304 07-OCT-14 05.00.50.295000000 AM 1303 07-OCT-14 04.59.01.434000000 AM 1302 06-OCT-14 11.34.43.012000000 AM 1301 06-OCT-14 11.31.18.855000000 AM 1300 06-OCT-14 11.27.16.237000000 AM 1280 04-OCT-14 04.47.40.391000000 AM 1261 01-OCT-14 05.09.06.291000000 PM 1260 01-OCT-14 10.18.41.@SequenceGenerator(name="GEN_PROMID",generator="GEN_PROMID") @Column(name="PROMOTIONID") private Long promotionid;0000 AM 解决方法序列生成器是一致的.它的唯一任务是生成唯一的整数值,没有别的.为什么你会被这种行为困扰?如上所述,此行为是由oracle缓存,预分配,序列号(默认为20)引起的. ID列是代理/人工主键,仅用于唯一标识行,不应从中派生任何信息.即使您没有缓存序列号,由于回滚事务,删除,应用程序和数据库服务器重新启动,您将永远不会获得一系列不间断的ID.而且高速缓存序列对高容量事务系统的性能损失很大. 所以忽略它,没关系,没有错.没有无间隙序列发生器这样的东西…… (编辑:海南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |